CodeGym /Cursos /SQL SELF /Agrupación de datos (GROUP BY): sintaxis y estructura

Agrupación de datos (GROUP BY): sintaxis y estructura

SQL SELF
Nivel 8 , Lección 0
Disponible

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:

  1. Indica la columna por la que quieres agrupar los datos en GROUP BY.
  2. Usa funciones agregadas para calcular valores en los grupos.
  3. Todas las columnas en SELECT que no estén en funciones agregadas deben estar en GROUP 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

  1. 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.

  1. 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
  1. 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:

  1. No pones todas las columnas en SELECT. Recuerda, cada columna que no sea un agregado debe estar en GROUP BY. Si no, SQL no sabrá cómo mostrarla.

  2. Agrupar por NULL. Los valores NULL cuentan como un grupo aparte. Si tu columna tiene NULL, SQL creará un grupo para NULL.

  3. 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.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION