Lección 4
GROUP BY y agregación
Resume filas con COUNT, SUM, GROUP BY, HAVING y buckets de tiempo.
La agregación convierte muchas filas en filas resumidas. En lugar de devolver cada pedido, puedes contar pedidos por estado:
SELECT status, COUNT(*) AS order_count
FROM orders
GROUP BY status
ORDER BY order_count DESC;
GROUP BY decide la granularidad del resultado. Si agrupas por status, hay una fila por estado. Si agrupas por status, user_id, hay una fila por combinación de estado y usuario.
WHERE vs HAVING
Usa WHERE antes de agrupar para filtrar filas en bruto:
WHERE created_at >= '2026-01-01'
Usa HAVING después de agrupar para filtrar resultados agregados:
HAVING COUNT(*) > 10
Si un informe parece incorrecto, comprueba si el filtro corresponde antes o después de la agregación.
Los buckets de fecha son específicos del dialecto
Las consultas de informes suelen agrupar por día, semana o mes. Cada base de datos tiene funciones de fecha distintas. PostgreSQL puede usar date_trunc, mientras MySQL y SQLite usan funciones diferentes.
Esta es una razón por la que el Formateador SQL expone opciones de dialecto. El formateo puede manejar mejor estructuras comunes cuando conoce la familia del lenguaje.
Conclusión clave
Antes de leer números agregados, identifica la granularidad: ¿una fila por qué? La mayoría de bugs de agregación provienen de agrupar demasiado amplio, demasiado estrecho o filtrar en la etapa incorrecta.
Prueba a formatear una consulta agregada con el Formateador SQL y marca qué columnas definen la granularidad del resultado.