Saltar al contenido principal
eLearner.app
Módulo 3 · Lección 3 de 411/57 en el curso~10 min
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

SQL
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".

SQL
-- 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:

SQL
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:

  1. una de las columnas de agrupación (por ejemplo, department_id, d.name), o
  2. dentro de una función agregada (por ejemplo, AVG(salary), COUNT(*)).
SQL
-- 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

Ejercicio#sql.m3.l3.e1
Intentos: 0Cargando...

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.

Cargando editor...
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

Ejercicio#sql.m3.l3.e2
Intentos: 0Cargando...

Para cada departamento (departamentos.nombre), calcule el salario promedio (AVG(salario)) de sus empleados, ordenados de mayor a menor.

Cargando editor...
Mostrar pista

AVG(e.salary) como agregado, GROUP BY d.name, ORDER BY promedio DESC.

Solución disponible después de 3 intentos