Sentencia GROUP BY y funciones agregadas en SQL

Las funciones agregadas, son funciones que permiten realizar operaciones sobre un conjunto de resultados devolviendo un solo valor agregado. A menudo, son utilizadas junto a la cláusula GROUP BY.

COUNT

La función COUNT, como el resto de funciones agregadas, se coloca siempre en el SELECT delante del FROM. Se utiliza para contar el número de registros. Si no lleva ninguna condición devolvería el número total de registros.

SELECT COUNT(*) totalClientes
FROM Clientes;
totalClientes
7

El resultado de la sentencia nos indica que la tabla Clientes consta de un total de 7 registros en la actualidad.

El uso de funciones agregadas no deja exenta la utilización del resto de cláusulas de una SELECT. Además, no están limitadas a una única función por sentencia, pudiéndose aplicar varias en una misma consulta.

A continuación, veremos otro ejemplo sencillo sobre la tabla Pedidos:

SELECT COUNT (producto) AS totalAlexa
FROM Pedidos
WHERE producto LIKE '%ECHO%';
totalAlexa
2

El resultado nos indica que la tabla Pedidos contine dos registros de dispositivos Alexa ECHO.

En las funciones agregadas, es recomendable utilizar siempre un alias para la definición de las columnas que guarden dichos valores del conjunto de resultados.

MAX

La función MAX devuelve el valor máximo del campo especificado:

SELECT MAX(precio) precioMaximo
FROM Pedidos;
precioMaximo
2449,5

Esta consulta nos indica que nuestro producto más caro de la tabla Pedidos tiene un valor de: 2449,50 euros.

MIN

La función MIN devuelve el valor mínimo del campo especificado:

SELECT MIN(precio) precioMinimo
FROM Pedidos;
precioMinimo
39,99

Esta consulta nos indica que nuestro producto más barato de la tabla Pedidos tiene un valor de: 39,99 euros.

SUM

La función SUM devuelve el valor total de la suma de una columna. Esta función es solo aplicable a campos numéricos siendo los valores NULL ignorados.

SELECT SUM(totalPrecio) beneficio
FROM Pedidos;
beneficio
17251,6

A través de esta consulta accedemos rápidamente al resultado final de la suma de todos los precios totales de la tabla Pedidos.

AVG

La función AVG devuelve el valor promedio del campo especificado. Esta función es solo aplicable a campos numéricos siendo los valores NULL ignorados.

SELECT AVG(precio) precioPromedio
FROM Pedidos;
precioPromedio
610,73875

Esta consulta nos indica el valor del precio promedio de la tabla Pedidos.

Para acceder a más información sobre funciones agregadas, podéis visitar la documentación de Microsoft.

GROUP BY

La cláusula GROUP BY se utiliza para agrupar los resultados de acuerdo a la columna seleccionada, devolviendo una fila de resultados para cada grupo de dicha columna. GROUP BY se utiliza a menudo junto a funciones agregadas.

En cuanto a la sintaxis, la cláusula GROUP BY se sitúa al final de la sentencia después del WHERE, pero antes del ORDER BY en caso de aplicarse ambas cláusulas.

En primer lugar, ejecutamos la siguiente SELECT de ejemplo sin añadir cláusula GROUP BY:

SELECT C.idClientes,
       C.nombre,
       C.apellidos
FROM Clientes C
INNER JOIN Pedidos P
ON C.idClientes = p.idClientes
ORDER BY C.idClientes ASC;
idClientes nombre apellidos
1 Fernando García Rodriguez
2 María Lopez ruiz
2 María Lopez ruiz
3 Ana Fernandez Montero
4 Luis Sanchez García
4 Luis Sanchez García
5 Alejandro Valero Martinez

Al establecerse una relación INNER JOIN entre la tabla Clientes y Pedidos, está SELECT nos permite ver que Clientes han realizado algún pedido, estando por ende, el idClientes presente en la tabla Pedidos tantas veces como pedidos realizados.

Ahora, lanzamos la misma consulta con GROUP BY para ver la diferencia en el resultado de ejecución:

SELECT C.idClientes,
       C.nombre,
       C.apellidos
FROM Clientes C
INNER JOIN Pedidos P
ON C.idClientes = p.idClientes
GROUP BY C.idClientes,
         C.nombre,
         C.apellidos
ORDER BY C.idClientes ASC;
idClientes nombre apellidos
1 Fernando García Rodriguez
2 María Lopez ruiz
3 Ana Fernandez Montero
4 Luis Sanchez García
5 Alejandro Valero Martinez

Observamos que ahora ha agrupado los registros de mismo valor, eliminando la duplicidad en la consulta.

Como ya hemos mencionado anteriormente, GROUP BY se utiliza a menudo junto a funciones agregadas para ampliar la información devuelta en la consulta:

SELECT C.idClientes,
       C.nombre,
       C.apellidos,
       COUNT (*) numeroPedidos,
       SUM (totalPrecio) gastoTotalCliente
FROM Clientes C
INNER JOIN Pedidos P
ON C.idClientes = p.idClientes
GROUP BY C.idClientes,
         C.nombre,
         C.apellidos;
idClientes nombre apellidos numeroPedidos gastoTotalCliente
1 Fernando García Rodriguez 1 2449,5
2 María Lopez ruiz 2 3199,78
3 Ana Fernandez Montero 1 4304,25
4 Luis Sanchez García 2 4999
5 Alejandro Valero Martinez 1 899,97

Gracias a las funciones agregadas, podemos observar el número de pedidos realizados por cada cliente y el gastoTotal de acuerdo al número de pedidos realizados.