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

Explicación de GROUP BY en SQL

La sentencia SQL GROUP BY es fácil de usar, pero puede ser difícil de dominar. Aprenda lo que puede hacer con GROUP BY, cómo funciona y cómo usarlo con las funciones agregadas.

GROUP BY es una de las herramientas básicas de SQL. Sin embargo, puede ser difícil para los principiantes entender cómo funciona GROUP BY y cómo se utiliza para calcular estadísticas con diferentes funciones de agregado. En este artículo, utilizaré varios ejemplos para mostrar exactamente cómo GROUP BY organiza las filas y cómo las funciones agregadas pueden utilizarse para calcular estadísticas en una o más columnas.

Así que, empecemos.

¿Cómo funciona SQL GROUP BY?

GROUP BY es una herramienta indispensable para cualquier analista de datos que trabaje con SQL. Si quieres organizar tus datos en grupos y calcular algún tipo de estadística agregada para estos grupos, la cláusula GROUP BY es lo que necesitas.

Entonces, ¿qué hace GROUP BY? Básicamente, agrupa las filas con el mismo valor en un grupo o cubo. Veamos cómo funciona.

Supongamos que tenemos una librería y queremos saber cuántos libros de diferentes géneros tenemos en stock. Nuestra base de datos incluye una tabla que enumera los títulos de los libros, los géneros y la cantidad de existencias.

La siguiente visualización muestra cómo la cláusula GROUP BY crea grupos a partir de los datos de la tabla. Queremos saber la cantidad total de libros de cada género; por lo tanto, GROUP BY agrupa los libros del mismo género y suma las cantidades correspondientes. Esto crea una tabla de resultados que enumera los géneros y su cantidad total de libros en nuestro stock.

GROUP BY sum

Para una introducción más detallada al tema GROUP BY, vea este video tutorial de nuestra serie "Aprendemos SQL".

GROUP BY en acción

Ahora es el momento de ver ejemplos más específicos de consultas SQL con una cláusula GROUP BY. Utilizaremos la tabla books que almacena el ID, el título, el autor, el género, el idioma, el precio y la cantidad de cada novela que almacenamos.

idtitleauthorgenrelangpriceqty
1Les Trois MousquetairesAlexandre Dumasadventurefr11.904
2A Game of ThronesGeorge R.R. Martinfantasyen8.495
3Pride and PrejudiceJane Austenromanceen9.992
4Vampire AcademyRichelle Meadfantasyen7.993
5IvanhoeWalter Scottadventureen9.993
6ArmanceStendhalromancefr5.881

Para calcular el número total de libros de cada género, utilizaremos la siguiente consulta:

SELECT genre, SUM(qty) AS total
FROM books
GROUP BY genre;

Aquí, en la cláusula GROUP BY, seleccionamos nuestras filas para ser agrupadas por la columna género. A continuación, la función SUM(qty) de la sentencia SELECT suma los valores de qty dentro de cada grupo (es decir, cada género de libro), y el resultado se muestra en el campo correspondiente total:

genretotal
adventure7
fantasy8
romance3

Uso de funciones agregadas con GROUP BY

GROUP BY pone las filas con el mismo valor en un solo cubo. Normalmente queremos calcular algunas estadísticas para este grupo de filas, como el valor medio o la cantidad total. Para ello, SQL proporciona funciones de agregación que combinan los valores de una determinada columna en un valor para el grupo respectivo.

Hasta ahora, sólo hemos utilizado SUM() como nuestra función agregada para agrupar los títulos de libros en stock. Sin embargo, esta no es la única función agregada que puede utilizar con GROUP BY. SQL también ofrece

  • COUNT() calcular el número de filas en cada grupo.
  • AVG() encontrar el valor medio de cada grupo.
  • MIN() devolver el valor mínimo de cada grupo.
  • MAX() devolver el valor máximo de cada grupo.

Veamos cómo funciona la función AVG() con GROUP BY. Esta vez, queremos calcular el precio medio de los libros de cada género. Empezaremos por visualizar el resultado que queremos obtener.

GROUP BY avg

Volvemos a agrupar nuestros libros por género, pero esta vez queremos calcular el precio medio de los libros en cada género. La consulta SQL para ello es la siguiente:

SELECT genre, AVG(price) AS avg_price
FROM books
GROUP BY genre;

Esta consulta crea una tabla con dos columnas (género y avg_price), donde el precio medio se calcula promediando los valores de los precios de los libros de cada género:

genreavg_price
adventure10.945
fantasy8.24
romance7.935

En realidad, no estamos limitados a utilizar sólo una función agregada con una cláusula GROUP BY. Así pues, vamos a añadir la información sobre el precio mínimo y máximo de los libros de cada género:

SELECT genre, 
MIN(price) AS min_price, 
     AVG(price) AS avg_price, 
MAX(price) AS max_price
FROM books
GROUP BY genre;

El conjunto de resultados incluye ahora cuatro columnas: genre, min_price, avg_price, y max_price.

genremin_priceavg_pricemax_price
adventure9.9910.94511.90
fantasy7.998.248.49
romance5.887.9359.99

Tenga en cuenta que cuando se utiliza GROUP BY la sentencia SELECT sólo puede incluir campos que se utilizan en la función de agregación o que aparecen en la cláusula GROUP BY . Por ejemplo, en nuestro caso, no podemos añadir title o author a nuestro conjunto de resultados. Hacerlo no tiene sentido, ya que cada fila de nuestra tabla de salida incluye información sobre varios libros con diferentes títulos y autores.

Para conocer otros problemas que puede encontrar al utilizar GROUP BY en SQL, consulte este artículo que analiza los errores comunes de GROUP BY y cómo evitarlos.

Agrupar por dos columnas

En SQL, también puedes agrupar tus datos usando varias columnas. Por ejemplo, digamos que queremos agrupar nuestros libros no sólo por género sino también por idioma. Y queremos calcular el número de títulos de libros en cada categoría.

Sugerencia: La función de agregación COUNT() nos ayudará a calcular el número de títulos de libros (es decir, las filas).

Para calcular el número de títulos de libros por género e idioma, utilizaremos la siguiente consulta:

SELECT genre, lang, count(title) AS titles
FROM books
GROUP BY genre, lang;

Obtendremos una tabla de salida con tres columnas: genre El género, el idioma (lang), y el número de titles en esa categoría:

genrelangtitles
adventureen1
adventurefr1
fantasyen2
romanceen1
romancefr1

Así, en nuestro conjunto de datos de ejemplo, tenemos:

  • Un título de libro en inglésen el género de aventuras(Ivanhoe).
  • Un título de libro en francés en el género de aventuras (Les Trois Mousquetaires).
  • Dos libros en inglés del género fantástico (A Game of Thrones y Vampire Academy).
  • Un libro en inglés del género romántico (Pride and Prejudice).
  • Un libro de género romántico en francés(Armance).

Como ve, no hay libros de fantasía en francés en nuestro conjunto de datos.

Para ver más ejemplos de aplicaciones de GROUP BY, consulte este artículo que muestra cómo se puede aprovechar GROUP BY en escenarios empresariales realistas.

¿Listo para usar GROUP BY en SQL?

Ahora tiene una mejor comprensión de cómo GROUP BY puede ayudarle a organizar y analizar sus datos. Sin embargo, si quieres manejar GROUP BY como un profesional, necesitas mucha práctica.

LearnSQL.es ofrece un SQL para principiantes curso que incluye 129 ejercicios interactivos que cubren la agregación, la agrupación, los JOIN, las subconsultas y mucho más. Este curso es una oportunidad perfecta para aprender a agrupar filas y calcular estadísticas con funciones de agregación.

¡Feliz aprendizaje!