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

Cómo utilizar GROUP BY en SQL

En este artículo, le daremos una guía paso a paso sobre el uso de GROUP BY en SQL. Descubre los matices de la función GROUP BY y aprenda diferentes formas de utilizarla.

GROUP BY es una de las cláusulas más utilizadas en SQL. Permite pasar de la simple selección de datos de la base de datos a la agrupación de filas con los mismos valores de columna en un grupo. Cuando se utiliza con las funciones de agregación de SQL, puede utilizar GROUP BY para calcular métricas como el recuento del número de instancias o la búsqueda del valor total, medio, mínimo o máximo.

GROUP BY forma parte de los conocimientos básicos de SQL; debe sentirse realmente cómodo con él antes de pasar a conceptos más complicados.

Ya sabes que a escribir código se aprende mejor con la práctica. Encontrar la oportunidad de escribir código SQL con regularidad puede ser difícil si no trabajas con SQL a diario. Difícil, pero no imposible. Lo que lo hace posible es el Ejercicios prácticos de SQL curso. Sus 88 ejercicios ofrecen muchas oportunidades para practicar GROUP BY y algunos otros conceptos de SQL, como funciones agregadas, JOINs y subconsultas.

¿Cómo funciona GROUP BY? Un Ejemplo

Utilizaré la tabla typewriter_products para demostrar la importancia de la cláusula GROUP BY en SQL. Muestra cosas que se pueden comprar en una empresa ficticia que vende productos relacionados con máquinas de escribir. Para los que se lo pregunten, se trata de una máquina de escribir:

Cómo utilizar GROUP BY en SQL

Fuente: https://i.etsystatic.com/8429430/r/il/132716/1789166606/il_fullxfull.1789166606_1qnc.jpg

Casi como un ordenador sin pantalla. Quién sabe cuántos libros importantes se escribieron utilizando una máquina de escribir. Libros, ¿te acuerdas de ellos?

(¡Pero basta ya de petulancia! ¡Hablemos de la mesa!)

Sí, la tabla. Tiene las siguientes columnas:

  • id - ID único del registro.
  • product_name - El nombre del producto.
  • product_id - ID del producto.
  • ribbon_brand - La marca de la cinta de máquina de escribir.
  • typewriter_brand - La marca de la máquina de escribir para la que está hecha la cinta.
  • ribbon_color - El color de la cinta de máquina de escribir.
  • units - El número de unidades disponibles del producto.
  • price - El precio unitario del producto.

Los datos en sí se muestran a continuación.

idproduct_nameproduct_idribbon_brandtypewriter_brandribbon_colorunitsprice
1typewriter ribbon1All You NeedOlympiaBlack8810.00
2typewriter ribbon1All You NeedOlympiaBlack + Red4810.00
3typewriter ribbon2Ribbons & UsOlympiaBlack9712.39
4typewriter ribbon2Ribbons & UsOlympiaBlack + Red14715.15
5typewriter ribbon3All You NeedUnderwoodBlack1424.74
6typewriter ribbon3All You NeedUnderwoodBlack + Red1325.17
7typewriter ribbon4Our RibbonUnderwoodBlack5425.00
8typewriter ribbon5Ribbons & UsUnderwoodBlack15730.47
9typewriter ribbon5Ribbons & UsUnderwoodBlack + Red1428.47
10typewriter ribbon6All You NeedAdlerBlack4420.00
11typewriter ribbon6All You NeedAdlerBlack + Red1630.00
12typewriter ribbon7Ribbons & UsAdlerBlack5424.69
13typewriter ribbon7Ribbons & UsAdlerBlack + Red2730.30

Con esta tabla, puedes obtener varios grupos. Por ejemplo, puedes calcular el precio medio de un producto según la marca de la máquina de escribir.

Esta es la consulta que lo hará:

SELECT typewriter_brand,
 AVG(price) AS average_price
FROM typewriter_products
GROUP BY typewriter_brand;

Esta consulta agrupa los datos por la marca de la máquina de escribir y calcula el precio medio. La consulta mostrará esta tabla:

typewriter_brandaverage_price
Adler26.25
Olympia11.89
Underwood26.77

La salida muestra tres tipos de marcas de máquinas de escribir y el precio medio del producto para cada máquina de escribir.

O puede encontrar el número de cintas disponibles por color con esta consulta:

SELECT ribbon_color,
	 SUM(units) AS sum_units
FROM typewriter_products
GROUP BY ribbon_color;

El grupo en esta consulta es el color de la cinta. También utilizo la función agregada SUM() para sumar el número de unidades por color de cinta. He aquí el resultado:

ribbon_colorsum_units
Black508
Black + Red265

Los datos se agrupan en dos filas: cinta negra y cinta negra + roja. Para cada color de cinta, hay un número de unidades disponibles para la venta.

Esto es un adelanto de lo que hace GROUP BY y cómo funciona. Como puede ver, la sintaxis GROUP BY es relativamente sencilla. Si necesitas más aclaraciones sobre la sintaxis GROUP BY, echa un vistazo a este artículo.

¿Cómo puedes escribir tus propias consultas y utilizar la cláusula GROUP BY? Aquí tienes algunos consejos que te ayudarán.

Pasos para utilizar GROUP BY

¿Cómo usar GROUP BY en SQL? Te daré una receta paso a paso en esta sección. Imaginemos que quiero encontrar el número de registros de cada producto.

El primer paso para escribir una consulta debería ser encontrar una columna de agrupación adecuada. En este caso, es product_id. Colocamos esta columna en la cláusula GROUP BY:

SELECT
…
GROUP BY product_id;

El segundo paso es elegir la función agregada adecuada y utilizarla en la sentencia SELECT. Como nuestro objetivo es encontrar el número de registros, utilizamos la función COUNT(). Por supuesto, también es necesario especificar la columna en la cláusula FROM:

SELECT COUNT(*)
FROM typewriter_products
GROUP BY product_id;

¿Se ejecutará esta consulta? Por supuesto. Devolverá este resultado.

count
2
2
1
2
2
2
2

Como puede ver, esto no es muy útil. Todos los productos tienen dos registros excepto uno, pero ¿cuáles son esos productos? No tenemos ni idea.

Por eso es importante el tercer paso. En este paso, escribe también la columna de agrupación en SELECT:

SELECT product_id,
	 COUNT(*)
FROM typewriter_products
GROUP BY product_id
ORDER BY product_id; 

Ahora, la consulta mostrará este resultado.

product_idcount
12
22
32
41
52
62
72

Esto es mucho más útil, ¿verdad? Ahora sabe que el producto con ID 4 sólo aparece una vez en la tabla. Probablemente haya notado que utilicé COUNT(*) en las consultas anteriores. Esta no es la única forma de utilizar la función de agregado. También puedes conocer todas las opciones para utilizar COUNT().

Comparando las dos consultas anteriores, puedes ver que es posible usar una columna en GROUP BY pero no usarla en SELECT; la agrupación sigue funcionando.

¿Y si utilizas la columna en la sentencia SELECT pero no en GROUP BY? No, no es posible. La regla general es: Si la columna está en SELECT y no se utiliza en una función agregada, debe aparecer en la cláusula GROUP BY. Aquí hay más detalles sobre esta regla.

Otros Consejos para Usar GROUP BY en SQL

Aunque el uso de GROUP BY parece bastante sencillo (¡y lo es!), existen algunos otros consejos y trucos que harán de su uso una experiencia mucho más cómoda.

Utilice un Identificador Único

A la hora de elegir por qué columna agrupar, por lo general se debe utilizar la columna que identifica de forma única al grupo. Si no lo hace, el resultado que obtenga podría ser engañoso o simplemente erróneo.

Por ejemplo, vamos a mostrar los productos por marca de máquina de escribir, pero intente agrupar los datos por nombre de producto. La consulta ...

SELECT product_name,
	 typewriter_brand,
	 COUNT(*) AS product_count
FROM typewriter_products
GROUP BY product_name, typewriter_brand
ORDER BY typewriter_brand;

... mostrará la siguiente tabla:

product_nametypewriter_brandproduct_count
typewriter ribbonAdler4
typewriter ribbonOlympia4
typewriter ribbonUnderwood5

Si agrupara los datos de esta manera, tendría la impresión errónea de que sólo hay un producto para cada una de las tres marcas de máquinas de escribir: un producto que aparece cuatro veces para las máquinas de escribir Adler y Olympia y cinco veces para Underwood.

¿Y si utilizara la columna product_id en lugar de nombre_producto?

SELECT product_id,
	 typewriter_brand,
	 COUNT(*) AS product_count
FROM typewriter_products
GROUP BY product_id, typewriter_brand
ORDER BY typewriter_brand;

Ahora verá que el resultado es un poco diferente:

product_idtypewriter_brandproduct_count
6Adler2
7Adler2
1Olympia2
2Olympia2
3Underwood2
4Underwood1
5Underwood2

Sigue habiendo productos para tres marcas de máquinas de escribir. Sin embargo, ahora sabe que hay dos productos para Adler y Olympia, ambos aparecen dos veces para cada máquina de escribir. Hay tres productos para Underwood. No sólo eso, sino que también sabe de qué productos se trata.

Veamos este ejemplo:

SELECT product_id,
	 product_name,
	 typewriter_brand,
	 COUNT(*) AS product_count
FROM typewriter_products
GROUP BY product_id, product_name, typewriter_brand
ORDER BY typewriter_brand;

Se trata de una versión ampliada de la consulta anterior. Volvemos a agrupar por product_id. Para obtener el número de apariciones de productos, utilizamos la función COUNT(). También queremos más etiquetas, así que añadimos el nombre del producto y la marca de la máquina de escribir al SELECT.

Dado que estas columnas aparecen en el SELECT, también deben aparecer en GROUP BY. Observa que todas las columnas lo hacen excepto la que tiene la función de agregado.

Echa un vistazo a la salida:

product_idproduct_nametypewriter_brandproduct_count
6typewriter ribbonAdler2
7typewriter ribbonAdler2
1typewriter ribbonOlympia2
2typewriter ribbonOlympia2
3typewriter ribbonUnderwood2
4typewriter ribbonUnderwood1
5typewriter ribbonUnderwood2

Puede ver que esta salida da la imagen más clara. Hay siete productos diferentes, pero todos son cintas de máquina de escribir. Estos productos son para tres marcas de máquinas de escribir. Todos los productos tienen dos apariciones, excepto el producto nº 4.

Agrupación por valor

No siempre tiene que agrupar por la columna ID. También es posible agrupar datos por valor.

Por ejemplo, si quisiera saber cuántas unidades hay por el color de la cinta, utilizaría esta consulta:

SELECT ribbon_color,
	 SUM(units) AS units_sum
FROM typewriter_products
GROUP BY ribbon_color;

Aquí utilizamos el color de la cinta como criterio de agrupación. La función de agregado SUM() totalizará las unidades de la siguiente manera:

ribbon_colorunits_sum
Black508
Black + Red265

El resultado muestra que hay 508 cintas negras y 265 cintas negras y rojas.

Si no estás familiarizado con la suma de valores, consulta la explicación de la función SUM(). Las funciones MIN() & MAX() también se utilizan comúnmente con GROUP BY.

Dos Columnas como Definidor de Grupo

La cláusula GROUP BY te permite agrupar datos por dos o más columnas; ya lo has visto. Pero también es posible utilizar dos columnas como identificador único de un grupo. Por ejemplo:

SELECT ribbon_color,
	 typewriter_brand,
	 SUM(units) AS units_sum
FROM typewriter_products
GROUP BY ribbon_color, typewriter_brand
ORDER BY typewriter_brand;

En esta consulta, utilizamos las columnas ribbon_color y typewriter_brand para definir un grupo. Cada color de cinta para una máquina de escribir específica se mostrará sólo una vez. Para ese grupo definido, calculamos el número de cintas disponibles:

ribbon_colortypewriter_brandunits_sum
BlackAdler98
Black + RedAdler43
BlackOlympia185
Black + RedOlympia195
BlackUnderwood225
Black + RedUnderwood27

Agrupar por una expresión

En lugar de agrupar sólo por columnas, también es posible agrupar datos por una expresión.

Veamos la siguiente consulta:

SELECT ribbon_brand,
	 ribbon_color,
	 units*price AS product_value,
 SUM(units*price) AS product_value_sum
FROM typewriter_products
GROUP BY ribbon_brand, ribbon_color, units*price
ORDER BY ribbon_brand;

Aquí seleccionamos la marca y el color de la cinta. Además, también calculamos el valor de cada grupo multiplicando la unidad por el precio.

A continuación, agrupamos los datos por las columnas ribbon_brand y ribbon_color. Esto es algo a lo que ya estás acostumbrado. Pero también añadimos la fórmula para calcular el valor a la cláusula GROUP BY. Queremos mostrar sólo valores únicos por marca de cinta y color. Si hay varios valores calculados iguales dentro del mismo grupo, se mostrarán como una sola fila.

Para que la agregación sea más obvia, he añadido la suma de los valores de los productos. Pronto verás por qué.

ribbon_brandribbon_colorproduct_valueproduct_value_sum
All You NeedBlack346.36346.36
All You NeedBlack880.001,760.00
All You NeedBlack + Red327.21327.21
All You NeedBlack + Red480.00960.00
Our RibbonBlack1,350.001,350.00
Ribbons & UsBlack1,201.831,201.83
Ribbons & UsBlack1,333.261,333.26
Ribbons & UsBlack4,783.794,783.79
Ribbons & UsBlack + Red398.58398.58
Ribbons & UsBlack + Red818.10818.10
Ribbons & UsBlack + Red2,227.052,227.05

Podría parecer que esta tabla no está agrupada en absoluto. Pero veámoslo más de cerca. Si los datos no estuvieran agrupados, la marca All You Need habría aparecido seis veces, igual que Ribbons & Us. Pero sólo aparece cuatro veces. ¿Por qué? Porque los valores 880,00 y 480,00 aparecen dos veces cada uno, por lo que están agrupados.

Esto es lo que indica la columna product_value_sum en las filas coloreadas. Éstas son las únicas filas en las que esta columna es diferente de valor_producto. La fila verde tiene una suma de 1.760,00 porque el valor 880,00 aparece dos veces. La suma de la fila roja es 960.00 porque 480.00 aparece dos veces.

Pasos para escribir una consulta con las funciones GROUP BY y Aggregate

Ya has interiorizado GROUP BY a través de la escritura de todas las consultas anteriores. Pero creo que vale la pena tener esto como una lista separada - la lista de pasos.

  • Paso 1: Identifique la(s) columna(s) de agrupación, es decir, la(s) columna(s) por la(s) que desea agrupar los datos. Una vez identificada, introdúzcala en la cláusula GROUP BY.
  • Paso2: En función de la métrica que desee calcular, elija la función de agregación adecuada y utilícela en la sentencia SELECT.
  • Paso3 : Utiliza la columna de agrupación en la sentencia SELECT. De esta forma, obtendrá etiquetas de datos para cada grupo, no sólo la salida de la función agregada.

Ningún usuario de SQL puede evitar el uso de GROUP BY

Ningún usuario de SQL que yo conozca ha conseguido llevar una vida SQL satisfactoria y escribir consultas sin GROUP BY. Es imposible. Así que, ¿por qué no practicar GROUP BY y otras expresiones y funciones SQL? Lo más sensato sería Ejercicios prácticos de SQL. Te ofrece la oportunidad de practicar todas las diferentes formas de usar GROUP BY cubiertas en el artículo.

En nuestro blog encontrarás otros recursos útiles con ejemplos de GROUP BY; el concepto también aparece a menudo en las preguntas de las entrevistas de trabajo de SQL.