Contenido de esta guía
Qué hace GROUP BY
GROUP BY divide las filas en conjuntos que comparten uno o varios valores. Después, las funciones de agregación calculan un resultado para cada conjunto.
Sin agrupación, COUNT, SUM o AVG suelen producir una sola fila. Al agrupar por ciudad, estado o categoría, producen una fila por cada valor distinto de esa clave.
Cómo pensar los grupos
SELECT clave_del_grupo,
FUNCION(valor) AS resumen
FROM tabla
WHERE condicion
GROUP BY clave_del_grupo;Cada columna seleccionada debe tener un papel claro: o identifica el grupo o contiene un cálculo agregado. Pregúntate «¿qué representa una fila final?». En un resumen por ciudad, una fila representa una ciudad, no un cliente.
WHERE filtra filas antes de formar los grupos. HAVING filtra grupos después de calcularlos. Esta diferencia determina dónde debe ir cada condición.
Ejemplo guiado
Contamos cuántos clientes hay en cada ciudad:
SELECT ciudad, COUNT(*) AS clientes
FROM clientes
GROUP BY ciudad
ORDER BY clientes DESC, ciudad ASC;| ciudad | clientes |
|---|---|
| Madrid | 4 |
| Bilbao | 2 |
| Sevilla | 2 |
| Valencia | 2 |
| A Coruña | 1 |
| Zaragoza | 1 |
Las doce filas originales se convierten en seis grupos. El orden no forma los grupos: únicamente presenta primero las ciudades con más clientes.
Error frecuente
Seleccionar una columna que no identifica el grupo
SELECT ciudad, nombre, COUNT(*) ... GROUP BY ciudad no define qué nombre debe mostrarse para una ciudad con varias personas. Algunos motores rechazan la consulta y otros pueden devolver un valor indeterminado. Selecciona solo las claves agrupadas y los cálculos agregados.
Comprueba lo aprendido
Cuenta los pedidos por estado
Devuelve una fila por cada estado de la tabla pedidos y cuenta sus pedidos. Llama pedidos al recuento y ordena por estado.
estado.COUNT(*) para contar filas.GROUP BY estado antes de ORDER BY.Solución razonada
SELECT estado, COUNT(*) AS pedidos
FROM pedidos
GROUP BY estado
ORDER BY estado;| estado | pedidos |
|---|---|
| cancelado | 3 |
| enviado | 9 |
| pendiente | 6 |
Cada fila final representa un estado y su número de pedidos.
Compatibilidad entre motores
La agrupación básica es portable. Los motores difieren en extensiones como agrupaciones múltiples, ROLLUP o CUBE, y en cuánto permiten seleccionar columnas no agrupadas. Para escribir consultas fiables, incluye en GROUP BY las columnas no agregadas que aparecen en el resultado.
Qué debes recordar
GROUP BYdefine qué representa cada fila resumida.- Las agregaciones se calculan dentro de cada grupo.
WHEREactúa antes de agrupar.- No mezcles columnas sueltas con resultados agregados.