Imagina que estás currando con miles de filas de datos — ¿cómo encuentras algo de sentido ahí? Aquí entra el operador GROUP BY — el auténtico director de orquesta en SQL. Coge datos dispersos y los convierte en una melodía clara: cuenta, agrupa, saca conclusiones. ¿Quieres saber cuántos pedidos hizo cada cliente, cuántos estudiantes hay en cada curso o cómo se reparten los sueldos por departamentos? Todo eso es trabajo de GROUP BY. Hoy vamos a ver cómo llevarnos bien con él y sacarle el máximo partido a tus tablas.
Agrupar es el proceso de juntar filas que tienen los mismos valores en una o varias columnas, formando grupos lógicos. Así puedes aplicar funciones agregadas por separado a cada grupo.
Imagina que tienes una tabla de empleados y quieres saber el sueldo medio por cada departamento. Un departamento — un grupo. SQL usa GROUP BY para dividir la tabla de empleados en grupos por departamento, y luego aplica AVG() a cada grupo.
Sintaxis de GROUP BY
La regla principal al usar agrupación en SQL: si usas GROUP BY, cada columna que no sea parte de una función agregada debe estar en GROUP BY.
Sintaxis:
SELECT columna1,
funcion_agregada(columna2)
FROM tabla
GROUP BY columna1;
Pasos:
- Indica la columna por la que quieres agrupar los datos en
GROUP BY. - Usa funciones agregadas para calcular valores en los grupos.
- Todas las columnas en
SELECTque no estén en funciones agregadas deben estar enGROUP BY. Sí, SQL es estricto con esto, y si se te olvida, te soltará un error.
Ejemplo: Agrupar estudiantes por facultad
Supón que tenemos una tabla students que guarda datos de estudiantes:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Ahora queremos saber la nota media (GPA) por cada facultad. Para eso escribimos una consulta con GROUP BY:
SELECT faculty, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
Resultado:
| faculty | avg_gpa |
|---|---|
| ComputerSci | 3.9 |
| Math | 3.7 |
| Physics | 3.7 |
SQL primero separó los datos en grupos según el valor de la columna faculty, y luego aplicó la función AVG() a cada grupo.
Peculiaridades al trabajar con GROUP BY
- Requisitos para columnas en
SELECT
SQL exige que todas las columnas que pongas en SELECT y que no uses en funciones agregadas (como SUM(), COUNT()), estén en GROUP BY. Esto es porque sin agrupar, SQL no sabe qué valores mostrar.
Prueba a ejecutar esta consulta y verás un error:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty;
Error: la columna name no está en GROUP BY. Para arreglarlo, añade name a GROUP BY:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty, name;
Peeeero eso ya agrupa los datos a nivel de estudiante concreto — no es lo que buscábamos al principio.
- Agrupar por varias columnas
Puedes agrupar datos no solo por una columna, sino por varias. Por ejemplo, además de por facultad, queremos agrupar estudiantes por su nombre. Solo añade la segunda columna en GROUP BY:
SELECT faculty, name, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty, name;
Tabla original:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Resultado:
| faculty | name | avg_gpa |
|---|---|---|
| ComputerSci | Alex Lin | 3.8 |
| ComputerSci | Anna Song | 4.0 |
| Math | Maria Chi | 3.5 |
| Math | Otto Art | 3.9 |
| Physics | Liam Park | 3.7 |
- Agrupar usando varias funciones agregadas
¡No te limites a una sola función! Por ejemplo, queremos contar cuántos estudiantes hay en cada facultad y calcular la nota media:
SELECT faculty,
COUNT(*) AS student_count,
AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
Tabla original:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Resultado:
| faculty | student_count | avg_gpa |
|---|---|---|
| ComputerSci | 2 | 3.9 |
| Math | 2 | 3.7 |
| Physics | 1 | 3.7 |
Peculiaridades de la agrupación en SQL: qué se puede y qué no se puede seleccionar
Es fácil escribir consultas con agrupación, pero probablemente la mitad de tus consultas no van a funcionar. La agrupación funciona un poco diferente a como solemos pensar.
Si tienes un GROUP BY en tu consulta SQL, piensa en todas las columnas del resultado como expresiones calculadas. Las columnas en SELECT solo pueden ser de dos tipos:
- calculadas por funciones agregadas basadas en las columnas del grupo.
- tomadas de GROUP BY - por las que se hace la agrupación.
Si haces una consulta GROUP BY sobre la tabla de estudiantes, ¡en la tabla resultante no puedes tener estudiantes concretos! Puedes tener la altura media, el peso medio, la nota media. Este código no va a funcionar:
SELECT faculty, name
FROM students
GROUP BY faculty;
Vamos a ver por qué.
El operador GROUP BY faculty divide los estudiantes de la tabla students en grupos con el mismo faculty en cada grupo. Como todos los estudiantes del grupo tienen el mismo faculty, se puede decir que el atributo faculty pertenece al grupo de estudiantes. Pero name es diferente para cada estudiante. Así que el grupo no tiene un atributo name.
El operador GROUP BY faculty, gender divide los estudiantes de la tabla students en grupos con el mismo faculty y gender en cada grupo. Así que todos los estudiantes de cada grupo tendrán el mismo faculty y gender. Por eso se puede decir que el grupo de estudiantes tiene los atributos faculty y gender. Pero el grupo sigue sin tener un name único.
Esto sí se puede hacer:
SELECT faculty, gender
FROM students
GROUP BY faculty, gender;
Incluso así:
SELECT
faculty,
gender,
AVG(age) as group_avg_age, -- Valor calculado a partir de los valores de age del grupo de estudiantes
MAX(high) as group_high -- Valor calculado a partir de los valores de high del grupo de estudiantes
FROM students
GROUP BY faculty, gender;
Pero simplemente usar age y high en SELECT en nuestro caso no se puede.
Errores típicos al usar GROUP BY
Cuando empieces a escribir consultas con GROUP BY, aquí tienes algunos problemas que te puedes encontrar:
No pones todas las columnas en
SELECT. Recuerda, cada columna que no sea un agregado debe estar enGROUP BY. Si no, SQL no sabrá cómo mostrarla.Agrupar por
NULL. Los valoresNULLcuentan como un grupo aparte. Si tu columna tieneNULL, SQL creará un grupo paraNULL.Grupos de más. Si por error metes demasiadas columnas en
GROUP BY, puedes acabar con resultados demasiado detallados, que son más difíciles de analizar.
Ahora ya sabes cómo agrupar datos de forma eficiente usando GROUP BY. Es una de las herramientas más potentes en SQL, que te permite trabajar fácil con datos agregados y crear informes estructurados. Más adelante seguiremos profundizando en la magia de la agrupación y veremos cómo poner filtros extra usando HAVING.
GO TO FULL VERSION