Agregación · long-tail práctico

GROUP BY con varias columnas

Agrupa por combinaciones de valores y entiende exactamente qué representa cada fila del resultado.

Lectura: 7–9 minEjemplo comprobadoPráctica con pistas
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:

Modelo mental
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

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

SQL comprobado
SELECT ciudad,
       activo,
       COUNT(*) AS clientes
FROM clientes
GROUP BY ciudad, activo
ORDER BY ciudad, activo DESC;
Resultado completo con la base educativa
ciudadactivoclientes
A Coruña11
Bilbao12
Madrid13
Madrid01
Sevilla12
Valencia12
Zaragoza11

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

Qué representa cada fila resumida
AgrupamientoUna fila del resultado representa…
GROUP BY ciudaduna ciudad
GROUP BY ciudad, activouna combinación de ciudad y estado activo
GROUP BY cliente_id, estadouna 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

Problemático
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

Intermedia · agregación

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.

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 BY forman 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 BY no sustituye a ORDER BY.

Conceptos relacionados

Fuentes técnicas consultadas