Course
Cómo utilizar GROUP BY y HAVING en SQL
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 CodeBase 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
, sales
y 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
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
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 claveAS
seguido 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
LIMIT
seguido 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.
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
- En lugar de contar el número de filas, tenemos el
AVG()
para obtener el precio medio y laSUM()
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:
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 WHERE
la 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
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 HAVING
sino 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_emissions
que contiene la emisión de los productos suministrados por las empresas.
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
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
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 SELECT
pero empieza seleccionando qué tablas incluir, y SELECT
se ejecuta después de HAVING
. Esto explica por qué HAVING
no permite el uso de ALIAS
mientras 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.
Cursos de SQL
Course
Intermediate SQL
Course
Introduction to SQL Server
blog