Contenido de esta guía
Respuesta rápida
GROUP BY columna_a, columna_b crea un grupo por cada combinación distinta de valores. No agrupa primero por una columna y después “dentro” de ella de forma separada: la clave del grupo es la pareja completa.
Si agrupas clientes por ciudad y activo, Madrid con activo = 1 y Madrid con activo = 0 son dos grupos diferentes.
Piensa en una clave de grupo compuesta
Con una sola columna, cada valor distinto identifica un grupo. Con varias columnas, la identidad del grupo es la combinación. Una forma útil de leerlo es imaginar una clave temporal:
GROUP BY ciudad, activo
clave del grupo = (ciudad, activo)Dos filas pertenecen al mismo grupo únicamente cuando coinciden en todos los valores de esa clave. Esto permite responder preguntas más específicas sin perder la lógica de GROUP BY.
Sintaxis con dos o más columnas
SELECT columna_a,
columna_b,
COUNT(*) AS filas
FROM tabla
GROUP BY columna_a, columna_b;Las columnas no agregadas que muestras en SELECT deben identificar el grupo de forma válida. Para una ruta portable y fácil de razonar, incluye en GROUP BY todas las columnas no agregadas del resultado.
Ejemplo: clientes por ciudad y estado activo
La tabla clientes contiene varias ciudades y una columna activo con valores 1 y 0. Queremos saber cuántos clientes existen para cada combinación.
SELECT ciudad,
activo,
COUNT(*) AS clientes
FROM clientes
GROUP BY ciudad, activo
ORDER BY ciudad, activo DESC;| ciudad | activo | clientes |
|---|---|---|
| A Coruña | 1 | 1 |
| Bilbao | 1 | 2 |
| Madrid | 1 | 3 |
| Madrid | 0 | 1 |
| Sevilla | 1 | 2 |
| Valencia | 1 | 2 |
| Zaragoza | 1 | 1 |
Madrid aparece dos veces porque existen dos combinaciones: ('Madrid', 1) y ('Madrid', 0). Si agrupáramos solo por ciudad, ambas quedarían dentro de un único grupo de cuatro clientes.
Una columna frente a varias
| Agrupamiento | Una fila del resultado representa… |
|---|---|
GROUP BY ciudad | una ciudad |
GROUP BY ciudad, activo | una combinación de ciudad y estado activo |
GROUP BY cliente_id, estado | una combinación de cliente y estado de pedido |
La pregunta pedagógica sigue siendo la misma: “¿qué representa una fila después de agrupar?”. Añadir columnas a GROUP BY hace esa unidad de análisis más específica.
Errores frecuentes
Agrupar solo por una parte de lo que muestras
SELECT ciudad, activo, COUNT(*)
FROM clientes
GROUP BY ciudad;Para una consulta portable, activo no debería quedar suelto: una ciudad puede contener clientes activos e inactivos. Si necesitas ambas dimensiones en el resultado, agrupa por ambas.
Confundir agrupamiento con orden visual
GROUP BY ciudad, activo no garantiza que el resultado se muestre en ese orden. Si la presentación importa, añade un ORDER BY explícito.
Añadir columnas sin revisar la granularidad
Cada columna adicional puede dividir grupos existentes en grupos más pequeños. Si agregas una clave casi única, puedes terminar con grupos de una sola fila y perder el resumen que buscabas.
Práctica guiada
Pedidos por cliente y estado
Para los clientes 1, 2 y 3, devuelve cliente_id, estado y el número de pedidos de cada combinación. Ordena por cliente y estado.
cliente_id IN (1, 2, 3).COUNT(*) para contar las filas de cada combinación.Solución razonada
SELECT cliente_id,
estado,
COUNT(*) AS pedidos
FROM pedidos
WHERE cliente_id IN (1, 2, 3)
GROUP BY cliente_id, estado
ORDER BY cliente_id, estado;El resultado contiene seis combinaciones: el cliente 1 tiene un pedido cancelado, uno enviado y uno pendiente; el cliente 2 tiene dos pendientes; el cliente 3 tiene uno cancelado y dos enviados. La suma de los conteos coincide con los ocho pedidos de esos tres clientes.
Compatibilidad entre motores
La idea de agrupar por varias expresiones está documentada en PostgreSQL y SQLite. Los motores pueden diferir en extensiones avanzadas o en cuánto permiten seleccionar columnas no agrupadas. Para escribir SQL predecible, trata la combinación de columnas de GROUP BY como la identidad explícita de cada fila resumida.
Qué debes recordar
- Varias columnas en
GROUP BYforman una clave de grupo compuesta. - Una fila del resultado representa una combinación distinta de esos valores.
- Añadir una columna hace el agrupamiento más específico.
GROUP BYno sustituye aORDER BY.