Lecciones del módulo (3/4)
Agrupar con GROUP BY
En el Módulo 2 aprendiste que COUNT(*), AVG(...), SUM(...) reducen todos
filas a una fila de resultado única. Pero, ¿qué pasa si quieres un salario promedio?
¿para cada departamento, no para toda la empresa? Quieres una fila por
grupo. Ese es el trabajo de GROUP BY.
La sintaxis
SELECT grouping_column, AGGREGATE_FUNCTION(...)
FROM table
GROUP BY grouping_column;Leer en inglés: "dividir las filas en grupos que compartan el mismo valor de
grouping_column, y para cada grupo calcular el agregado".
-- Average salary per department:
SELECT department_id, AVG(salary) AS average
FROM employees
GROUP BY department_id;El resultado tiene una fila para cada department_id distinto que se encuentra en
CÓDIGOPH1. Obtendrás 5 filas: una para cada uno de los 4 departamentos (1, 2,
3, 4) más uno para NULL (Andrea Costa).
Con JOIN para nombres legibles
A menudo desea agrupar por department_id pero muestra el nombre del
departamento. Combinas GROUP BY con un JOIN:
SELECT d.name AS department,
COUNT(*) AS count,
AVG(e.salary) AS average_salary
FROM employees AS e
JOIN departments AS d ON e.department_id = d.id
GROUP BY d.name
ORDER BY count DESC;Esta es una consulta de inteligencia empresarial completa: en tres líneas le indica cuántos empleados tiene cada departamento y cuánto ganan promedio, ordenados de mayor a menor.
La regla de oro
Cuando usa GROUP BY, cada columna en SELECT debe ser:
- una de las columnas de agrupación (por ejemplo,
department_id,d.name), o - dentro de una función agregada (por ejemplo,
AVG(salary),COUNT(*)).
-- ERROR: first_name is neither in GROUP BY nor inside an aggregate
SELECT department_id, first_name, AVG(salary)
FROM employees
GROUP BY department_id;PostgreSQL devuelve un error explícito ("la columna debe aparecer en GROUP BY
cláusula o utilizarse en una función agregada"). Es algo común en las primeras semanas.
error: si lo ves, detente y pregúntate "¿cuál es el valor de
¿first_name para un grupo de 3 personas?" — no hay una respuesta única, y
por eso el motor se niega.
Pruébalo
Para cada departamento, calcule cuántos empleados contiene. Devuelve dos columnas: el nombre del departamento (departamentos.nombre) y el recuento de empleados. Una fila por departamento.
Mostrar pista
Agregue con COUNT(*) y agrupe por d.name. SELECT debe contener solo la columna de agrupación y el agregado.
Solución disponible después de 3 intentos
Ejercicio de revisión
Para cada departamento (departamentos.nombre), calcule el salario promedio (AVG(salario)) de sus empleados, ordenados de mayor a menor.
Mostrar pista
AVG(e.salary) como agregado, GROUP BY d.name, ORDER BY promedio DESC.
Solución disponible después de 3 intentos