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

5 Ejemplos de GROUP BY

Cuando empiezas a aprender SQL, te encuentras rápidamente con la cláusula GROUP BY. La agrupación de datos -o la agregación de datos- es un concepto importante en el mundo de las bases de datos. En este artículo, demostraremos cómo puede utilizar la cláusula GROUP BY en la práctica. Hemos reunido cinco ejemplos de GROUP BY, desde los más sencillos hasta los más complejos, para que puedas ver la agrupación de datos en un escenario real. Además, aprenderá un poco sobre las funciones agregadas y la cláusula HAVING.

SQL es un lenguaje universal para hablar con las bases de datos que existe desde hace casi 50 años. Si eres un completo principiante, considera tomar nuestro curso SQL para principiantes antes de leer este artículo.

Uno de los conceptos centrales de SQL es la agrupación de datos, o la agregación de datos. Si estás leyendo este artículo, probablemente ya hayas oído hablar de la cláusula GROUP BY. Para ayudarte a entenderla mejor, hemos presentado cinco problemas empresariales y hemos mostrado cómo se pueden resolver en nuestros ejemplos de GROUP BY.

Si necesita una rápida introducción a GROUP BY, vea nuestro vídeo de cinco minutos en YouTube.

En este artículo, vamos a ayudar a un museo imaginario a analizar a sus visitantes. Utilizaremos el historial de visitas al museo para obtener información significativa utilizando la cláusula GROUP BY. ¡Manos a la obra, pues!

Datos de entrada

Vamos a trabajar con una sola tabla llamada visit. Cada fila representa una única visita al museo. A continuación, puedes ver algunas filas de ejemplo de esta tabla:

visit

datepriceduration
2020-05-01215
2020-05-01437
2020-05-06724
...

Como puede ver, la tabla no es muy complicada. Sólo contiene tres columnas:

  • fecha-Lafecha de la visita al museo.
  • precio-Elprecio pagado por la entrada en dólares (verá una variedad de precios porque el museo utiliza diferentes opciones de precios en varios días junto con muchos tipos de entradas reducidas).
  • duración-Laduración de la visita al museo en minutos.

Por cierto, si ya conoce las sentencias SQL básicas y quiere probar a crear tablas en su lugar, eche un vistazo a este curso LearnSQL.es fundamentos de la tabla.

¿Por qué agrupamos las filas?

Sabemos que podemos agregar (agrupar) filas en SQL, pero ¿por qué lo hacemos? La cláusula GROUP BY se utiliza normalmente junto con las funciones de agregación, que calculan varias estadísticas sobre los grupos de filas. Las cinco funciones agregadas más básicas en SQL son:

  • COUNT()-Se utilizan para contar el número de filas.
  • AVG()-Utilizadas para encontrar el valor medio.
  • MIN() y MAX()-Se utilizan para encontrar el valor mínimo y máximo, respectivamente.
  • SUM()-Se utiliza para encontrar la suma de todos los valores.

En resumen, agrupamos filas para calcular varias estadísticas.

Ejemplos de GROUP BY

Bien. Ahora que sabemos un poco sobre las funciones agregadas, veamos cinco ejemplos de GROUP BY.

Ejemplo 1: GROUP BY con una columna

Empezaremos con un ejemplo sencillo. Queremos saber cuántas personas visitaron el museo en cada día. En otras palabras, para cada fecha, mostraremos el número de visitas al museo. La consulta que necesitamos tendrá el siguiente aspecto:

SELECT date, COUNT(*)
FROM visit
GROUP BY date;

Sólo tenemos dos columnas: fecha y recuento. COUNT(*) significa "contar todo". Como también utilizamos la columna de fecha en la cláusula GROUP BY, veremos un recuento distinto para cada fecha. Cuando ejecutamos la consulta en nuestra base de datos, deberíamos ver algo así:

datecount
2020-06-297
2020-05-236
2020-06-235
...

Excelente. Ahora sabemos cuántas personas visitaron el museo cada día.

En lugar de COUNT(*), que significa "contar cada fila", también podríamos utilizar un nombre de columna dentro, por ejemplo, COUNT(duration). La diferencia es que COUNT(*) cuenta todas las filas de un grupo determinado incluso si algunas filas contienen valores NULL (desconocidos). COUNT(duration) En cambio, duration sólo cuenta las filas que tienen un valor no nulo en la columna . En nuestra tabla, sin embargo, no hay valores NULL, por lo que el resultado sería el mismo.

Ejemplo 2: Agrupar por con dos columnas

Ahora queremos saber el precio medio pagado por una entrada en un mes determinado. Para ello, necesitaremos una consulta más complicada. Eche un vistazo:

SELECT 
  EXTRACT(YEAR FROM date) AS year, 
  EXTRACT(MONTH FROM date) AS month, 
  ROUND(AVG(price), 2) AS avg_price
FROM visit
GROUP BY
  EXTRACT(YEAR FROM date),
  EXTRACT(MONTH FROM date);

Usamos la función EXTRACT(YEAR FROM date) para obtener el año de cada fecha, y usamos EXTRACT(MONTH FROM date) para obtener el mes (como valor numérico, donde "1" significa "enero", "2" significa "febrero", etc.). Ten en cuenta que se tratan como columnas separadas, por lo que verás el año en una columna y el mes en otra.

Como queremos ver la media de cada mes de cada año por separado, también tenemos que agrupar por estas dos columnas. Tenemos que repetir las mismas funciones en la cláusula GROUP BY.

La tercera columna es una combinación de dos funciones. Dentro, tenemos AVG(price), que calculará el precio medio de cada grupo. También tenemos ROUND(AVG(price), 2)) para redondear el valor medio a dos decimales.

Cuando utilice una cláusula GROUP BY, intente recordar la regla de oro: Todos los nombres de columnas de la cláusula SELECT deben aparecer en la cláusula GROUP BY o utilizarse en las funciones de agregación. En este caso, tanto EXTRACT(YEAR FROM date) como EXTRACT(MONTH FROM date) deben aparecer en la cláusula GROUP BY. Si te olvidas de una de ellas, probablemente verás un error. La tercera columna utiliza una función agregada, AVG(price), por lo que no se menciona en la cláusula GROUP BY.
Hay algunas excepciones a esta regla, y pueden dar lugar a un comportamiento inesperado.

Cuando ejecutemos la consulta, veremos algo así:

yearmonthavg_price
202057.52
202066.70

Como puede ver, el precio medio de las entradas disminuyó en junio, en comparación con mayo. Esto podría traducirse en menores ingresos para el museo.

Ejemplo 3: GROUP BY y ORDER BY

Esta vez, queremos encontrar el valor de la duración media de la visita para cada mes. También queremos asegurarnos de que las filas están ordenadas cronológicamente. La consulta que necesitaremos será similar a la del ejemplo anterior:

SELECT 
  EXTRACT(YEAR FROM date) AS year, 
  EXTRACT(MONTH FROM date) AS month, 
  ROUND(AVG(duration), 2)
FROM visit
GROUP BY 
  EXTRACT(YEAR FROM date), 
  EXTRACT(MONTH FROM date)
ORDER BY 
  EXTRACT(YEAR FROM date), 
  EXTRACT(MONTH FROM date);

La nueva pieza aquí es la cláusula ORDER BY. Una cláusula ORDER BY nos permite especificar el orden en que debemos ver las filas. En este caso, queremos ver todas las filas ordenadas primero por el año y luego por el mes.

De nuevo, necesitamos repetir las mismas funciones de la cláusula SELECT para que la cláusula ORDER BY funcione. Por defecto, ORDER BY ordena las filas en orden ascendente.

Si quiere ver las filas ordenadas en orden descendente, necesita añadir la palabra clave DESC después del nombre de la columna. Por ejemplo, escriba ORDER BY EXTRACT(YEAR FROM date) DESC. Puede leer más sobre la diferencia entre GROUP BY y ORDER BY en este artículo.

Cuando ejecutemos la consulta, veremos algo así

yearmonthavg_duration
2020547.61
2020651.33

De media, un visitante pasó más tiempo en el museo en junio que en mayo. ¡Eso es una buena noticia!

Ejemplo 4: GROUP BY y HAVING

Ahora tenemos el siguiente problema: queremos ver el precio medio de las entradas para cada día. Sin embargo, hay una condición extra: no queremos mostrar los días con 3 o menos visitas. Esta condición se traduce en una nueva pieza en nuestra consulta SQL. Eche un vistazo:

SELECT 
  date, 
  ROUND(AVG(price), 2) AS avg_price
FROM visit
GROUP BY date
HAVING COUNT(*) > 3
ORDER BY date;

La parte nueva aquí es HAVING COUNT(*) > 3. HAVING es una cláusula que podemos usar para filtrar en las filas agrupadas. En este caso, agrupamos las filas por la fecha (GROUP BY date). Cuando hacemos esto, queremos asegurarnos de que un grupo dado tiene más de tres filas (HAVING COUNT(*) > 3). Si un grupo (en este caso, las visitas de un día determinado) no cumple esta condición, no lo mostramos.

Cuando ejecutamos la consulta, veremos algo así:

dateavg_price
2020-05-015.80
2020-05-157.00
2020-05-236.67
...

Ejemplo 5: GROUP BY, HAVING y WHERE

Por último, tenemos que resolver el siguiente problema: queremos mostrar la duración media de las visitas de cada día. De nuevo, sólo queremos mostrar los días con más de tres visitas. Sin embargo, también queremos asegurarnos de que las visitas de cinco minutos o menos no se incluyan en los cálculos. Lo más probable es que se trate de pruebas realizadas por los empleados del museo, por lo que queremos ignorarlas. Esta es la consulta que necesitaremos:

SELECT 
  date, 
  ROUND(AVG(duration), 2) AS avg_duration
FROM visit
WHERE duration > 5
GROUP BY date
HAVING COUNT(*) > 3
ORDER BY date;

La parte nueva aquí es la cláusula WHERE. Se utiliza para incluir únicamente las visitas que han durado más de cinco minutos.

Las cláusulas WHERE y HAVING pueden parecer similares, pero hay una diferencia entre ellas: WHERE se utiliza para filtrar filas individuales antes de agruparlas (es decir, visitas individuales) mientras que HAVING se utiliza para filtrar grupos de filas (es decir, visitas en un día determinado). Más información en este artículo.

Cuando ejecutemos la consulta, veremos algo así:

dateavg_duration
2020-05-0129.80
2020-05-1555.75
2020-05-2332.17
2020-05-2969.50
2020-06-0239.83
2020-06-0448.67
2020-06-0948.50
2020-06-2351.60
2020-06-2957.86

Observe cómo la duración media de las visitas aumenta con casi todos los días de junio. Parece que hemos añadido una exposición interesante y nuestros visitantes la han difundido.

Resumen y seguimiento

Con estos cinco ejemplos, pasamos de casos fáciles a otros más complejos en GROUP BY. La versatilidad de SQL nos permitió analizar las visitas al museo y responder a varias preguntas sobre ellas. Esto demuestra la eficacia con la que GROUP BY puede resolver problemas empresariales reales.

Si quieres leer más sobre la cláusula GROUP BY, nuestra editora jefe de contenidos, Agnieszka, preparó un completo artículo disponible aquí.

Si te apetece aprender más SQL, echa un vistazo a LearnSQL.es. LearnSQL.es el equipo enseña SQL desde cero de forma totalmente interactiva.

Para los principiantes, tenemos nuestro curso más vendido SQL para principiantes. Garantizamos una entrada sin problemas en el mundo de la codificación para personas sin experiencia previa en informática. No tendrás que preocuparte por la configuración técnica: estudiarás directamente desde tu navegador web. Nosotros nos encargamos de la base de datos mientras usted se centra en los conceptos clave de SQL.

Si quieres saber más sobre las ventajas de aprender con nosotros antes de adquirir una suscripción, echa un vistazo a nuestro artículo: Por qué tomar el curso SQL para principiantes en LearnSQL.com. Este artículo explica en detalle por qué construimos el curso, lo que contiene, y la filosofía detrás de él.