Saltar al contenido principal
InicioTutorialesSQL

Cómo utilizar GROUP BY y HAVING en SQL

Una guía intuitiva para descubrir los dos comandos SQL más populares para agregar filas de tu conjunto de datos
Actualizado ene 2024  · 6 min leer
Lee la versión en inglés 🇺🇲 de este artículo.

La agregación es otro nombre para resumir tus puntos de datos y obtener un único valor. Por ejemplo, calcular la media o el mínimo. A veces, agregar todos tus datos dará como resultado un valor que no es útil.

Por ejemplo, si estás explorando el comportamiento de compra en tu tienda, y la gente que entra es una mezcla de estudiantes pobres y profesionales ricos, será más informativo calcular el gasto medio de esos grupos por separado. Es decir, necesitas agregar la cantidad gastada, agrupada por diferentes segmentos de clientes.

Este tutorial cubre el SQL GROUP BY así como la declaración HAVING que te ayuda a controlar qué filas de datos se incluyen en cada grupo.

HAVING está estrechamente relacionado con WHERE y tal vez quieras leer la Introducción a la cláusula Cláusula WHERE en SQL primero. También debes comprender SELECT y FROM como se explica en el Ejemplos y tutorial de consultas SQL.

¡Empecemos!

Domine sus habilidades de datos con Datacamp

Aprenda las habilidades que necesita a su propio ritmo, desde elementos esenciales no codificantes hasta ciencia de datos y aprendizaje automático.

Run and edit the code from this tutorial online

Run Code

Base de datos de empresas unicornio

Utilizaremos la Base de Datos de Empresas Unicornio, que está disponible en DataCamp Workspace. Estas empresas se denominan "Unicornio" porque son empresas emergentes con una valoración superior a los mil millones de dólares. Así pues, esta base de datos contiene los datos de estas Empresas Unicornio y está compuesta por siete tablas. Para simplificar, nos centraremos en tres tablas: companies, salesy product_emissions.

Utilizar SQL GROUP BY

GROUP BY es un comando SQL que se utiliza habitualmente para agregar los datos y obtener información de ellos. Hay tres fases cuando agrupas datos:

  • Dividir: el conjunto de datos se divide en trozos de filas en función de los valores de las variables que hemos elegido para la agregación
  • Aplica: Calcula una función agregada, como media, mínimo y máximo, devolviendo un único valor
  • Combina: Todas estas salidas resultantes se combinan en una tabla única. De este modo, tendremos un único valor para cada modalidad de la variable de interés.

SQL GROUP BY Ejemplo 1

Podemos empezar mostrando un ejemplo sencillo de GROUP BY. Supongamos que queremos encontrar los diez países con mayor número de empresas Unicornio. 

SELECT * 
FROM companies

Screenshot 2023-02-21 at 19.04.00.png

También estaría bien ordenar los resultados en orden decreciente según el número de empresas

SELECT country, COUNT(*) AS n_companies
FROM companies
GROUP BY country
ORDER BY n_companies DESC
LIMIT 10

image4.png

Aquí tenemos los resultados. Probablemente no te sorprenderá encontrar a EEUU, China e India en la clasificación. Vamos a explicar la decisión que hay detrás de esta consulta: 

  • En primer lugar, observa que hemos utilizado COUNT(*) para contar las filas de cada grupo, que corresponde al país. Además, también utilizamos el alias SQL para renombrar la columna con un nombre más explicable. Esto es posible utilizando la palabra clave ASseguido del nuevo nombre. COUNT se trata con más profundidad en el tutorial FUNCIÓN SQL CONTAR().
  • Los campos se seleccionaron de la tabla empresas, donde cada fila corresponde a una empresa Unicornio. 
  • Después, tenemos que especificar el nombre de la columna después de GROUP BY para agregar los datos en función del país. 
  • ORDER BY para visualizar los países en el orden correcto, del mayor número al menor número de empresas. 
  • Limitamos los resultados a 10 utilizando LIMITseguido del número de filas que quieres que aparezcan en los resultados.

SQL GROUP BY Ejemplo 2 

Ahora analizaremos la tabla con las ventas. Para cada número de pedido, tenemos el tipo de cliente, la línea de productos, la cantidad, el precio unitario, el total, etc.

Screenshot 2023-02-21 at 19.05.13.png

Esta vez, nos interesa averiguar el precio medio por unidad, el número total de pedidos y la ganancia total de cada línea de productos:

SELECT 
    product_line,
    AVG(unit_price) AS avg_price,
    SUM(quantity) AS tot_pieces,
    SUM(total) AS total_gain
FROM sales
GROUP BY product_line
ORDER BY total_gain DESC

image7.png

  • En lugar de contar el número de filas, tenemos el AVG() para obtener el precio medio y la SUM() para calcular el número total de pedidos y la ganancia total de cada línea de productos. 
  • Como antes, especificamos la columna que divide inicialmente el conjunto de datos en trozos. A continuación, las funciones de agregación nos permitirán obtener una fila por cada modalidad de la línea de productos. 
  • Esta vez, ORDER BY es opcional. Se incluyó para resaltar cómo las mayores ganancias totales no siempre son proporcionales a los mayores precios medios o piezas totales. 

Las limitaciones de WHERE

Volvamos al ejemplo anterior. Ahora, queremos poner una condición a la consulta: sólo queremos filtrar por el número total de pedidos superior a 40.000. Probemos el WHERE cláusula:

SELECT 
    product_line,
    AVG(unit_price) AS avg_price,
    SUM(quantity) AS tot_pieces,
    SUM(total) AS total_gain
FROM sales
WHERE SUM(total) > 40000
GROUP BY product_line
ORDER BY total_gain DESC

Esta consulta devolverá el siguiente error:

image1.png

Este error no es posible pasar funciones agregadas en la función WHERE cláusula. Necesitamos un nuevo comando para resolver este problema.

Uso de SQL HAVING

Como WHEREla HAVING filtra las filas de una tabla. Mientras que WHERE intenta filtrar toda la tabla, HAVING filtra las filas dentro de cada uno de los grupos definidos por GROUP BY

SQL HAVING Ejemplo 1

Aquí tienes de nuevo el ejemplo anterior, sustituyendo la palabra WHERE con HAVING.

SELECT 
    product_line,
    AVG(unit_price) AS avg_price,
    SUM(quantity) AS tot_pieces,
    SUM(total) AS total_gain
FROM sales
GROUP BY product_line
HAVING SUM(total) > 40000
ORDER BY total_gain DESC

image10.png

Esta vez producirá tres filas. Las otras líneas de productos no cumplían el criterio, así que pasamos de seis resultados a tres. 

¿Qué más notas en la consulta? No pasamos el alias de la columna a HAVINGsino la agregación del campo original. ¿Te preguntas por qué? Desvelarás el misterio en el siguiente ejemplo.

SQL HAVING Ejemplo 2

Como último ejemplo, utilizaremos la tabla llamada product_emissionsque contiene la emisión de los productos suministrados por las empresas.

Captura de pantalla 2023-02-21 a las 19.07.31.png

En esta ocasión, nos interesa mostrar la huella de carbono media del producto (pcf) de cada empresa perteneciente al grupo industrial "Hardware y Equipamiento Tecnológico". Además, sería útil ver el número de productos de cada empresa para comprender si existe alguna relación entre el número de productos y la huella de carbono. También volvemos a utilizar HAVING para extraer empresas con una huella de carbono media superior a 100.

SELECT pe.company, count(product_name) AS n_products, avg(carbon_footprint_pcf) AS avg_carbon_footprint_pcf
FROM product_emissions AS pe
WHERE industry_group = 'Technology Hardware & Equipment'
GROUP BY pe.company, industry_group
having avg_carbon_footprint_pcf>100
ORDER BY n_products

image5.png

Apareció un error al intentar utilizar el alias. Para los HAVING el nombre de la nueva columna no existe, por lo que no podrá filtrar la consulta. Corrijamos la petición:

SELECT pe.company, count(product_name) AS n_products, avg(carbon_footprint_pcf) AS avg_carbon_footprint_pcf
FROM product_emissions AS pe
WHERE industry_group = 'Technology Hardware & Equipment'
GROUP BY pe.company, industry_group
having avg(weight_kg)>100
ORDER BY n_products

image3.png

Esta vez, la condición funcionó, y podemos visualizar los resultados en la tabla. Acabamos de aprender que los alias de columna no pueden utilizarse en HAVING porque esta condición se aplica antes que SELECT. Por esta razón, no puede reconocer los campos a partir de los nuevos nombres.

Orden de ejecución SQL

Este es el orden de los comandos al escribir la consulta:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

Pero hay una pregunta que debes hacerte. ¿En qué orden se ejecutan los comandos SQL? Como humanos, a menudo damos por sentado que el ordenador lee e interpreta el SQL de arriba abajo. Pero la realidad es distinta de lo que podría parecer. Este es el orden correcto de ejecución:

FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT

 Así, el procesador de consultas no parte de SELECTpero empieza seleccionando qué tablas incluir, y SELECT se ejecuta después de HAVING. Esto explica por qué HAVING no permite el uso de ALIASmientras que ORDER BY no tiene problemas con ella. Además de este aspecto, este orden de ejecución aclara la razón por la que HAVING se utiliza junto con GROUP BY aplicar condiciones a los datos agregados, mientras que WHERE no puede. 

Llévalo al siguiente nivel

Después de leer este tutorial, deberías tener una idea clara de la diferencia entre GROUP BY y HAVING. Puedes practicar en el Espacio de Trabajo DataCamp para dominar estos conceptos.

Si quieres pasar al siguiente nivel del camino de aprendizaje de SQL, puedes seguir nuestro curso de SQL Intermedio. Si aún necesitas reforzar tus bases de SQL, puedes volver al curso Introducción a SQL para aprender los fundamentos del lenguaje. 

Temas

Cursos de SQL

Course

Introduction to SQL

2 hr
630.5K
Learn how to create and query relational databases using SQL in just two hours.
See DetailsRight Arrow
Start Course
Ver másRight Arrow
Relacionado

blog

SQL Server, PostgreSQL, MySQL... ¿cuál es la diferencia? ¿Por dónde empiezo?

En este tutorial, aprenderás algunas de las diferencias básicas entre los dialectos SQL y por dónde deberías empezar.
Mona Khalil's photo

Mona Khalil

5 min

See MoreSee More