Além de um único GROUP BY
Faça agregações em vários níveis.
Além de um único GROUP BY é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
A limitação de um único GROUP BY
Uma cláusula GROUP BY padrão permite agregar linhas em um único nível específico — por exemplo, o total de vendas por região. Mas e se você também quiser totais por categoria de produto e um total geral, tudo na mesma consulta?
Repetir a consulta três vezes e usar UNION ALL funciona, mas é verboso e lento. O SQL oferece três extensões poderosas — GROUPING SETS, ROLLUP e CUBE — que resolvem esse problema com elegância em uma única passagem.
SELECT region, SUM(amount) AS total_sales
FROM sales
GROUP BY region;Preparando a tabela de exemplo
Ao longo desta lição, usaremos uma tabela simples de sales que registra cada venda com uma region, uma category e um amount. Vamos criá-la e preenchê-la para que cada consulta apresentada a seguir faça sentido no contexto.
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales (region, category, amount) VALUES
('North', 'Electronics', 1200),
('North', 'Clothing', 800),
('South', 'Electronics', 950),
('South', 'Clothing', 600),
('East', 'Electronics', 1100),
('East', 'Clothing', 750);O que são GROUPING SETS
GROUPING SETS permite definir vários níveis independentes de agrupamento dentro de uma única cláusula GROUP BY. Cada conjunto da lista produz seu próprio grupo de linhas, como se você tivesse escrito consultas separadas e combinado os resultados com UNION ALL.
A sintaxe é: GROUP BY GROUPING SETS ( (col1, col2), (col1), () ). O conjunto vazio () representa o total geral de todas as linhas.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
);Lendo a saída de GROUPING SETS
Quando você executa uma consulta com GROUPING SETS, as linhas de diferentes níveis de agrupamento são empilhadas juntas. As colunas que não fazem parte de um determinado conjunto aparecem como NULL nessa linha.
Por exemplo, uma linha pertencente ao conjunto (region) terá NULL na coluna category, indicando que esse total abrange todas as categorias daquela região. A linha do total geral (conjunto vazio) tem NULL em region e category.
SELECT
COALESCE(region, 'ALL REGIONS') AS region,
COALESCE(category, 'ALL CATEGORIES') AS category,
SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
)
ORDER BY region NULLS LAST, category NULLS LAST;Apresentando ROLLUP
ROLLUP é um atalho para uma hierarquia comum de conjuntos de agrupamento. Dadas as colunas (A, B), ROLLUP(A, B) gera automaticamente os conjuntos: (A, B), (A) e ().
Isso é perfeito para dados hierárquicos, como ano, mês e dia, ou região e categoria. O número de conjuntos produzidos é sempre n + 1, em que n é o número de colunas listadas.
-- ROLLUP(region, category) is equivalent to:
-- GROUPING SETS ( (region, category), (region), () )
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;ROLLUP com três níveis
Adicionar uma terceira coluna a ROLLUP amplia a hierarquia com mais um nível. ROLLUP(A, B, C) gera quatro conjuntos: (A, B, C), (A, B), (A) e ().
No exemplo abaixo, year é o nível mais externo e category é o mais detalhado. A consulta produz subtotais em cada etapa da hierarquia, além de uma linha com o total geral.
SELECT
year,
region,
category,
SUM(amount) AS total
FROM (
VALUES
(2024, 'North', 'Electronics', 1200),
(2024, 'North', 'Clothing', 800),
(2024, 'South', 'Electronics', 950),
(2025, 'North', 'Electronics', 1400),
(2025, 'South', 'Clothing', 700)
) AS t(year, region, category, amount)
GROUP BY ROLLUP(year, region, category)
ORDER BY year NULLS LAST, region NULLS LAST, category NULLS LAST;Apresentando CUBE
CUBE é ainda mais abrangente do que ROLLUP. Dadas n colunas, ele gera todas as 2^n combinações possíveis de conjuntos de agrupamento, incluindo o total geral.
Para CUBE(region, category), os conjuntos produzidos são: (region, category), (region), (category) e () — quatro conjuntos no total. Isso é útil quando você quer totais sob todas as perspectivas, e não apenas ao longo de uma única hierarquia.
-- CUBE(region, category) produces:
-- GROUPING SETS ( (region,category), (region), (category), () )
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;CUBE versus ROLLUP — quando usar cada um
Escolha com base no fato de suas dimensões terem ou não uma hierarquia natural:
- Use ROLLUP quando as colunas forem hierárquicas (por exemplo, de país para cidade e loja). Os subtotais sobem apenas por um caminho.
- Use CUBE quando as colunas forem dimensões independentes (por exemplo, região e categoria) e você quiser todas as combinações possíveis.
- Use GROUPING SETS quando precisar de controle total e nem ROLLUP nem CUBE atenderem exatamente aos seus requisitos.
A função GROUPING()
Como NULL pode significar tanto um valor ausente real quanto um marcador de agrupamento, o SQL fornece a função GROUPING(). Ela retorna 1 quando a coluna faz parte de uma linha de superagregação (marcador) e 0 quando a coluna foi realmente usada no agrupamento.
Isso permite distinguir uma região com NULL real de uma linha de subtotal que abrange todas as regiões.
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_subtotal,
GROUPING(category) AS is_category_subtotal
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;Usando GROUPING() para rotular linhas
Um padrão comum é combinar GROUPING() com uma expressão CASE para produzir rótulos compreensíveis em vez de valores NULL brutos. Isso torna a saída de uma consulta com ROLLUP ou CUBE muito mais fácil de ler nos relatórios.
SELECT
CASE GROUPING(region)
WHEN 1 THEN 'Grand Total'
ELSE region
END AS region_label,
CASE GROUPING(category)
WHEN 1 THEN 'All Categories'
ELSE category
END AS category_label,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY GROUPING(region), region, GROUPING(category), category;Combinando colunas fixas com ROLLUP
Você pode combinar colunas regulares de GROUP BY com ROLLUP ou CUBE na mesma cláusula. As colunas listadas fora de ROLLUP(...) são sempre incluídas em todos os conjuntos de agrupamento — elas nunca são resumidas pelo ROLLUP.
Na consulta abaixo, year é uma coluna de agrupamento fixa, enquanto region e category participam do ROLLUP. Isso significa que você obtém subtotais por ano, e não abrangendo todos os anos.
SELECT
2024 AS year,
region,
category,
SUM(amount) AS total
FROM sales
GROUP BY 2024, ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;Verificação rápida
Teste sua compreensão de GROUPING SETS, ROLLUP e CUBE.
Recapitulação — além de um único GROUP BY
Nesta lição, você aprendeu três extensões poderosas do SQL que permitem produzir vários níveis de agregação em uma única consulta:
- GROUPING SETS — controle manual total; liste exatamente as combinações de que você precisa.
- ROLLUP — ideal para hierarquias; sobe do nível mais detalhado até o total geral.
- CUBE — gera todas as combinações possíveis das dimensões listadas.
Você também aprendeu que GROUPING() distingue valores NULL reais de linhas de superagregação usadas como marcadores e que os padrões CASE GROUPING(...) produzem uma saída de relatório limpa e legível.
Essas ferramentas são indispensáveis sempre que você precisa de resumos multidimensionais — relatórios no estilo de tabelas dinâmicas, painéis e consultas de armazéns de dados dependem muito delas.
Perguntas Frequentes
A aula “Além de um único GROUP BY” é grátis?
Sim — o texto completo de “Além de um único GROUP BY” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Além de um único GROUP BY”?
Faça agregações em vários níveis. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Além de um único GROUP BY”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Além de um único GROUP BY
- ROLLUP para subtotais
- CUBE para todas as combinações
- GROUPING SETS explicado