Agregación y GROUP BY

Mapa conceptual
- SQL
- Básico
- SELECT
- WHERE
- ORDER BY
- JOINs
- INNER
- LEFT
- FULL
- Agregación
- GROUP BY
- HAVING
- Avanzado
- Subconsultas
- CTEs
- Ventana
- Rendimiento
- EXPLAIN
- Índices
- Básico
Funciones de agregación
COUNT, SUM, AVG, MIN y MAX reducen un conjunto de filas a un valor. COUNT cuenta filas (o valores no nulos si se le da una columna), SUM acumula, AVG promedia ignorando nulos, y MIN y MAX devuelven extremos. Opera cada una sobre la columna indicada del grupo.
El concepto de grupo
Sin GROUP BY, una agregación trata toda la tabla como un único grupo y devuelve una fila. Con GROUP BY partes las filas en grupos según los valores de las columnas listadas, y calculas una agregación por grupo. El resultado tiene una fila por combinación distinta de esos valores.
La regla de oro de SELECT
Toda columna que aparezca en SELECT sin estar dentro de una agregación debe figurar también en GROUP BY. Si no, no está definida: el motor no sabe de qué fila del grupo tomar ese valor. Es el error clásico del que empieza y una garantía de que la consulta tiene sentido.
WHERE antes, HAVING después
WHERE filtra filas individuales antes de agrupar; HAVING filtra grupos ya agregados. No puedes poner una agregación en WHERE porque las filas aún no se han condensado. La pregunta que decide: ¿filto filas (WHERE) o filtro resúmenes (HAVING)?
Un ejemplo mental
Para «ventas totales por región que superen 10.000»: agrupas por región, sumas ventas y con HAVING conservas los grupos cuyo total pasa de 10.000. Si quisieras ignorar ventas nulas o de un producto concreto antes de sumar, eso iría en WHERE.
COUNT de asterisco frente a columna
COUNT con asterisco cuenta filas, incluidas las que tienen NULL en cualquier columna. COUNT de una columna cuenta solo los valores no nulos de esa columna. La diferencia importa cuando hay huecos: con asterisco obtienes el tamaño del grupo; con columna, cuántos respondieron.
COUNT DISTINCT
Para contar valores únicos en lugar de ocurrencias se usa COUNT con DISTINCT: usuarios distintos que compraron, no número de compras. Es la métrica estrella cuando interesa la cobertura y no el volumen.
- WHERE descarta filas no deseadas.
- GROUP BY reparte las supervivientes en grupos.
- Las agregaciones resumen cada grupo.
- HAVING elimina grupos que no interesan.
- SELECT proyecta grupo y resumen, ORDER BY ordena.
Agrupar por varias columnas
GROUP BY acepta varias columnas: el grupo queda definido por la combinación de todas ellas. Añadir una dimensión parte los grupos en más y más pequeños. Conviene pensar el GROUP BY como las etiquetas de fila de una tabla dinámica.
Agregaciones dentro de expresiones
Puedes combinar agregaciones con aritmética: ratio entre un SUM y un COUNT, o media de una resta. Lo que no puedes es mezclar una columna no agrupada con una agregada en la misma expresión, por la misma razón que antes.
Nulos en las agregaciones
Casi todas las agregaciones ignoran los NULL: AVG promedia solo los valores presentes, SUM los omite. Esto es a la vez útil y peligroso: una media calculada sobre dos de diez valores no es comparable con una llena. Vigila cuántos no nulos hay detrás de cada resumen.
| Quieres | Herramienta | Cuidado |
|---|---|---|
| una fila por categoría | GROUP BY | toda columna no agregada debe estar en el GROUP |
| filtrar filas antes de resumir | WHERE | no admite agregaciones |
| filtrar resúmenes | HAVING | se evalúa tras agrupar |
| valores únicos, no repeticiones | COUNT DISTINCT | más costoso que un COUNT normal |
Necesitas las regiones cuyo número de pedidos supere 50. ¿Dónde va esa condición?
Ordenar por una agregación
Es habitual querer el top: ordenar por la columna agregada de forma descendente y limitar. El orden lógico lo permite porque ORDER BY se evalúa tras SELECT, cuando la agregación ya existe con su alias.
Rendimiento de la agregación
Agrupar grandes volúmenes exige ordenar o hashear claves de grupo; sin índice en las columnas de GROUP BY puede ser caro. Filtrar pronto con WHERE reduce filas antes de agrupar y suele ser la optimización más barata de todas.
Errores frecuentes
- Olvidar incluir en GROUP BY una columna del SELECT que no está agregada.
- Poner una condición con COUNT o SUM dentro de WHERE.
- Contar con asterisco creyendo que cuentas valores no nulos.
HAVING puede contener funciones de agregación, mientras que WHERE no.
Del conteo a la proporción
Muchos indicadores son cocientes de agregaciones: tasa, media ponderada, participación. Dominar GROUP BY y sus agregaciones deja construir casi cualquier métrica de negocio a partir de filas de detalle.
Vocabulario de agregación
Toca una tarjeta para ver la respuesta.
Ordena las fases de una consulta agregada:
Arrastra cada ficha a su categoría (o tócala y luego toca la categoría). También puedes usar el teclado.
ModeTutorial de agregación y GROUP BY con datasets reales.
Escribe una consulta que dé, por producto, el número de pedidos y la venta media, mostrando solo productos con más de 100 pedidos. ¿Qué va en WHERE, qué en GROUP BY y qué en HAVING?
Tu texto se guarda sólo en este dispositivo.
SQLZooEjercicios interactivos de SQL en línea.
Comentarios
Inicia sesión para comentar.
Todavía no hay comentarios. Sé la primera persona en opinar.