Volver a la lista de artículos Artículos
Lectura de 6 minutos

Uso de GROUP BY en SQL

Ahora que conoce los comandos principales de SQL, potencie sus consultas con la cláusula GROUP BY y las funciones de agregación.

GROUP BY es una cláusula SQL que organiza los datos en grupos basados en un valor (o valores) común. Se utiliza ampliamente para obtener información resumida de grandes conjuntos de datos, así como para calcular estadísticas agregadas básicas.

Una vez que haya comprendido los comandos básicos de SQL como SELECT, WHERE, y JOIN, el dominio de la cláusula GROUP BY puede ayudarle a implementar sus conocimientos de SQL en escenarios de inteligencia empresarial del mundo real.

SQL GROUP BY se utiliza con mayor frecuencia en combinación con funciones de agregación como COUNT(), MAX(), MIN(), SUM() y AVG(). Agrupa el conjunto de resultados por una o más columnas, creando esencialmente filas de resumen para cada grupo. Estos grupos suelen basarse en valores categóricos y no continuos.

Por ejemplo, si utiliza un conjunto de datos de clientes globales para su empresa, puede utilizar la cláusula GROUP BY para resumir información como el "número total de clientes por cada país" o el "total de ventas por cliente".

Sintaxis de GROUP BY

Ahora que sabemos qué es la cláusula GROUP BY, veamos la sintaxis de una consulta básica de GROUP BY.

SELECT column_name(s)
FROM table_name
WHERE [condition]
GROUP BY column_name1, column_name2
HAVING [condition]
ORDER BY column_name

Aquí:

  • SELECT es la consulta estándar de SQL SELECT.
  • GROUP BY column_name1 realiza la agrupación basada en los valores de column_name1.
  • column_name2 se utiliza cuando la agrupación se realiza en más de una columna; se puede agrupar por cualquier número de columnas. Esto es opcional.
  • HAVING [condition] y WHERE [condition] también son opcionales; ambos se utilizan para restringir las filas afectadas por la cláusula GROUP BY. La diferencia clave es que WHERE filtra las filas antes de la agrupación y HAVING filtra los propios grupos una vez formados. Importante: WHERE debe preceder a la cláusula GROUP BY y HAVING debe seguirla.
  • ORDER BY [condition] se utiliza después de GROUP BY para clasificar u ordenar los datos por un determinado column_name.

Al principio, GROUP BY y ORDER BY parecen hacer lo mismo: ordenar los datos. Pero ahí acaban sus similitudes. Como su nombre indica, ORDER BY simplemente ordena el conjunto de datos en un orden definido, mientras que GROUP BY agrupa los datos como una salida agregada. Nuestro artículo anterior, La diferencia entre GROUP BY y ORDER BY en palabras sencillas, explica esto con más detalle; consúltelo si necesita un repaso.

Ahora, veamos cómo funciona la cláusula GROUP BY con consultas reales.

Agrupar por una sola columna

Para ayudar a entender el efecto de la cláusula GROUP BY, vamos a ejecutar una consulta sencilla en la tabla Orders que ha registrado 196 pedidos individuales. A continuación, puede ver las cinco primeras entradas de la tabla:

OrderIDCustomerIDEmployeeIDOrderDateShipperID
102489051996-07-043
102498161996-07-051
102503441996-07-082
102518431996-07-081
102527641996-07-092

Utilizando la tabla Orders averigüemos cuántos clientes únicos han realizado un pedido. Esta es la consulta:

SELECT CustomerID 
FROM Orders
GROUP BY CustomerID

RESULTADO

Number of Records: 74
CustomerID
2
3
4
5
7

Este es un ejemplo de una simple cláusula GROUP BY sobre una sola columna (CustomerID); la salida coloca todas las filas con el mismo valor para la columna CustomerID en el mismo grupo. También devuelve el número de clientes únicos que han realizado un pedido (74). Esencialmente, una cláusula GROUP BY sin una función de agregación se comporta de forma similar a una cláusula DISTINCT: encuentra los valores únicos de una columna.

La agrupación también puede hacerse por múltiples columnas. Esto es más útil cuando se utiliza con la(s) función(es) agregada(s).

Agrupación con funciones agregadas

La aplicación práctica del comando GROUP BY de SQL es resumir los parámetros estadísticos de grupos de datos; esto se consigue normalmente con funciones de agregación. Ahora exploraremos algunos ejemplos, utilizando las funciones Orders y la tabla OrderDetails tabla, un ejemplo de la cual se muestra a continuación:

OrderDetailIDOrderIDProductIDQuantity
1102481112
2102484210
310248725
410249149
5102495140

MAX(), MIN(), AVG(), SUM()

GROUP BY es perfecta para resumir los parámetros estadísticos de categorías individuales en su conjunto de datos. Por ejemplo, intentemos encontrar la cantidad máxima, mínima y media de cada ProductID por pedido y el número total de cada producto pedido. Utilizaremos la OrderDetails y pondremos los resultados en orden descendente por la suma de las cantidades pedidas de cada producto. Esto nos permitirá saber cuáles son los productos más populares de ProductID. Esta es la consulta:

SELECT ProductID, MAX(Quantity), Min(Quantity), AVG(Quantity), SUM (Quantity)
FROM OrderDetails
GROUP BY ProductID
Order By SUM(Quantity) DESC

RESULTADO

Number of Records: 77
ProductIDMAX(Quantity)Min(Quantity)AVG(Quantity)SUM (Quantity)
3170432.714285714285715458
6080635.833333333333336430
35100441369
5970624.714285714285715346
260731341

La siguiente tabla desglosa cómo se calculan algunos de estos valores agregados para los valores 2 y 31 de ProductID. La cláusula GROUP BY primero agrupa las filas para ProductID 2 y luego calcula los valores AVG() y MAX() para todo el grupo. Hace lo mismo para cada ProductID para cada una de las funciones agregadas en la consulta.

ProductIDQuantityAverage (?Quantity/# of ProductID)Max (Quantity)
2603160
250
245
240
235
…………
317032.71470
3160
3156
3142
3140
…………

Como ve, el comando GROUP BY es una herramienta extremadamente útil para encontrar resúmenes estadísticos para cualquier clase de variables.

Agrupar por múltiples columnas con COUNT()

Como se mencionó anteriormente, puede utilizar múltiples columnas en GROUP BY. En otras palabras, está colocando todas las filas con los mismos valores tanto en column_name1 como en column_name2 en un grupo.

Consideremos un ejemplo en el que queremos contar el número de veces que cada empleado ha utilizado cada servicio de envío. Una vez más, utilizaremos la tabla Orders tabla.

SELECT EmployeeID, ShipperID, COUNT(*)
FROM Orders
Group BY EmployeeID, ShipperID
Order BY ShipperID, Count(*) DESC

RESULTADO

Number of Records: 26
EmployeeIDShipperIDCOUNT(*)
4112
118
217
317
617
…….…….…….

Esta consulta podría utilizarse, por ejemplo, para obtener opiniones sobre el servicio de atención al cliente de los cargadores por parte de los empleados que han utilizado ese servicio. Como podemos ver arriba, ¡hay 26 pares de interacción únicos entre empleados y transportistas!

¿Cómo funciona entre bastidores la agrupación por dos columnas? Las filas con el mismo EmployeeID y ShipperID se emparejan en un grupo. El tamaño de esos grupos (es decir, el número de registros en el grupo) se calcula, como puede ver a continuación:

EmployeeIDShipperIDCount
11
11
1112
11
11
………….
41
41
418
41
41
………….

El comando GROUP BY es también una poderosa herramienta que puede combinarse con las cláusulas SQL HAVING y WHERE para definir condiciones adicionales para los resultados devueltos.

Tenga en cuenta que hay ciertas sutilezas cuando se utiliza GROUP BY con columnas que tienen NULL valores. Consulte nuestro artículo anterior sobre los errores comunes de GROUP BY para obtener algunos detalles adicionales.

Dominio de SQL GROUP BY

No hace falta decir que sólo la práctica le hará dominar este comando. La práctica se realiza mejor en conjuntos de datos del mundo real, donde se puede visualizar y relacionar con las necesidades del negocio. El curso SQL para principiantes curso incluye un amplio conjunto de ejercicios interactivos. Aprenderá a agrupar filas y a calcular estadísticas con funciones de agregación en conjuntos de datos prácticos. Pruébalo, ¡y buena suerte!