Funções de Agregação e GROUP BY
COUNT, SUM, AVG, HAVING e PARTITION BY
Funções de agregação calculam um valor a partir de múltiplas linhas: COUNT() conta registros, SUM() soma valores, AVG() calcula média, MAX() e MIN() retornam o maior e menor valor.
GROUP BY agrupa linhas com o mesmo valor em uma coluna e aplica as funções de agregação a cada grupo. Toda coluna no SELECT que não é uma função de agregação deve aparecer no GROUP BY.
HAVING é o filtro para grupos — funciona como WHERE, mas é aplicado após o agrupamento. Window functions (funções janela) como AVG() OVER (PARTITION BY ...) calculam agregações por grupo sem colapsar as linhas individuais.
-- Funções de agregação básicas
SELECT
COUNT(*) AS total_pedidos,
COUNT(DISTINCT cliente_id) AS clientes_únicos,
SUM(valor) AS receita_total,
AVG(valor) AS ticket_médio,
MAX(valor) AS maior_pedido,
MIN(valor) AS menor_pedido
FROM pedidos;
-- GROUP BY
SELECT
departamento,
COUNT(*) AS funcionarios,
AVG(salario) AS media_salarial
FROM funcionarios
GROUP BY departamento
ORDER BY media_salarial DESC;
-- HAVING — filtrar grupos
SELECT
cliente_id,
COUNT(*) AS total_pedidos
FROM pedidos
GROUP BY cliente_id
HAVING COUNT(*) >= 5 -- só clientes com 5+ pedidos
ORDER BY total_pedidos DESC;
-- Window function — mantém linhas individuais
SELECT
nome,
departamento,
salario,
AVG(salario) OVER (PARTITION BY departamento) AS media_depto,
salario - AVG(salario) OVER (PARTITION BY departamento) AS diff_media
FROM funcionarios;
-- ROW_NUMBER, RANK
SELECT
nome, salario,
ROW_NUMBER() OVER (ORDER BY salario DESC) AS ranking,
RANK() OVER (PARTITION BY depto ORDER BY salario DESC) AS rank_depto
FROM funcionarios;WHERE filtra antes do GROUP BY (mais eficiente). HAVING filtra depois — use WHERE quando possível e HAVING apenas para condições envolvendo agregações.