Lição 4
GROUP BY e agregação
Resuma linhas com COUNT, SUM, GROUP BY, HAVING e buckets de data.
Agregação transforma muitas linhas em linhas de resumo. Em vez de retornar cada pedido, você pode contar pedidos por status:
SELECT status, COUNT(*) AS order_count
FROM orders
GROUP BY status
ORDER BY order_count DESC;
GROUP BY define a granularidade do resultado. Se agrupar por status, há uma linha por status. Se agrupar por status, user_id, há uma linha por combinação de status e usuário.
WHERE vs HAVING
Use WHERE antes do agrupamento para filtrar linhas brutas:
WHERE created_at >= '2026-01-01'
Use HAVING depois do agrupamento para filtrar resultados agregados:
HAVING COUNT(*) > 10
Se um relatório parece errado, verifique se o filtro pertence antes ou depois da agregação.
Buckets de data são específicos do dialeto
Queries de relatório costumam agrupar por dia, semana ou mês. Cada banco tem funções de data diferentes. PostgreSQL pode usar date_trunc, enquanto MySQL e SQLite usam outras funções.
É uma razão pela qual o Formatador SQL expõe escolhas de dialeto. Formatar lida melhor com estruturas comuns quando conhece a família da linguagem.
Conclusão
Antes de ler números agregados, identifique a granularidade: uma linha por quê? A maioria dos bugs de agregação vem de agrupar largo demais, estreito demais ou filtrar no estágio errado.
Experimente formatar uma query agregada com o Formatador SQL e marque quais colunas definem a granularidade do resultado.