ROLLUP para subtotais
Subtotais correntes e totais gerais.
ROLLUP para subtotais é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 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.
O que é ROLLUP
Quando você agrupa dados com GROUP BY, obtém uma linha por grupo. Mas, muitas vezes, também quer subtotais para cada grupo e um total geral de todas as linhas. É exatamente isso que ROLLUP faz.
ROLLUP é uma extensão de GROUP BY que adiciona automaticamente linhas de resumo ao seu conjunto de resultados, fornecendo subtotais progressivos em cada nível da hierarquia de agrupamento e um total geral final.
Preparando dados de exemplo
Vamos criar uma tabela simples de vendas para praticar. Ela armazena a região, a categoria do produto e o valor da venda de cada transação. Execute as instruções abaixo para criá-la e preenchê-la.
CREATE TABLE sales (
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales VALUES
('East', 'Electronics', 500),
('East', 'Electronics', 300),
('East', 'Clothing', 150),
('West', 'Electronics', 700),
('West', 'Clothing', 200),
('West', 'Clothing', 100);Primeiro, um GROUP BY simples
Antes de usar ROLLUP, vamos ver o que um GROUP BY comum nos fornece. A consulta abaixo retorna um total para cada par (região, categoria) — sem subtotais e sem total geral.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY region, category
ORDER BY region, category;Apresentando GROUP BY ROLLUP
Substitua GROUP BY por GROUP BY ROLLUP(...) e o SQL adicionará as linhas de subtotal automaticamente. As colunas dentro de ROLLUP() formam uma hierarquia, e um subtotal é produzido para cada nível dessa hierarquia, além de um total geral final.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;Lendo a saída de ROLLUP
O resultado de ROLLUP contém três tipos de linhas:
- Linhas de detalhe — uma linha para cada combinação (região, categoria), assim como em um GROUP BY simples.
- Linhas de subtotal — uma linha por região com
category = NULL, mostrando o total regional. - Linha do total geral — uma linha em que região e categoria são
NULL, mostrando o total geral.
Os valores NULL funcionam como marcadores que indicam o nível resumido.
Usando COALESCE para rotular valores NULL
Os marcadores NULL podem parecer confusos para os usuários finais. Envolva cada coluna com COALESCE para substituí-los por rótulos significativos, como 'Todas as categorias' e 'Total geral'.
SELECT
COALESCE(region, 'Grand Total') AS region,
COALESCE(category, 'All Categories') AS category,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;ROLLUP com uma coluna
ROLLUP também funciona com apenas uma coluna. Quando você escreve ROLLUP(region), obtém uma linha por região e uma única linha com o total geral no final. Esta é a forma mais simples e é útil para qualquer relatório que precise de um total acumulado abaixo das linhas de detalhe.
SELECT
COALESCE(region, 'Grand Total') AS region,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region)
ORDER BY region;ROLLUP com três níveis
Você pode passar três ou mais colunas para ROLLUP a fim de criar hierarquias mais profundas. Com ROLLUP(year, region, category), você obteria subtotais por ano e região, subtotais por ano e um total geral — cada coluna adicional acrescenta outro nível de sumarização.
-- Extend the demo with a year column
SELECT
COALESCE(CAST(yr AS TEXT), 'All Years') AS year,
COALESCE(region, 'All Regions') AS region,
COALESCE(category, 'All Categories') AS category,
SUM(amount) AS total
FROM (
SELECT 2024 AS yr, region, category, amount FROM sales
UNION ALL
SELECT 2025 AS yr, region, category, amount FROM sales
) t
GROUP BY ROLLUP(yr, region, category)
ORDER BY yr, region, category;Identificando linhas de resumo com GROUPING()
A função GROUPING() retorna 1 quando o valor da coluna nessa linha é um NULL gerado pelo ROLLUP (um marcador de resumo) e 0 quando é um valor real dos dados. Isso permite distinguir valores NULL genuínos dos NULLs de resumo gerados pelo ROLLUP.
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_summary,
GROUPING(category) AS is_cat_summary
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;Filtrando linhas de resumo
Como ROLLUP adiciona linhas após a agregação, você não pode filtrá-las com WHERE. Use HAVING ou envolva a consulta inteira em uma subconsulta. O exemplo abaixo mantém apenas os subtotais regionais (linhas em que category é um NULL do ROLLUP, mas region é um valor real).
SELECT region, SUM(amount) AS regional_total
FROM sales
GROUP BY ROLLUP(region, category)
HAVING GROUPING(category) = 1
AND GROUPING(region) = 0
ORDER BY region;ROLLUP versus GROUPING SETS
ROLLUP(a, b) é uma forma abreviada de um conjunto específico de GROUPING SETS. As duas consultas abaixo são exatamente equivalentes — ROLLUP apenas evita que você precise escrever manualmente cada nível de agrupamento.
-- Using ROLLUP (concise)
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category);
-- Equivalent explicit GROUPING SETS
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS(
(region, category),
(region),
()
);Verificação rápida
Teste sua compreensão de ROLLUP com esta pergunta.
Recapitulação da lição
Excelente trabalho! Veja um resumo do que você aprendeu sobre ROLLUP:
- GROUP BY ROLLUP(a, b) gera automaticamente subtotais para cada nível da hierarquia de colunas e um total geral para todas as linhas.
- As linhas de resumo são marcadas com NULL nas colunas resumidas. Use COALESCE para atribuir rótulos legíveis a elas.
- A função GROUPING() retorna 1 para NULLs gerados pelo ROLLUP e 0 para valores reais dos dados, permitindo diferenciá-los.
- Use HAVING GROUPING(...) = 1 para filtrar apenas as linhas de resumo.
- ROLLUP(a, b) é uma forma abreviada de GROUPING SETS((a, b), (a), ()).
ROLLUP é a ferramenta ideal sempre que seu relatório precisar de subtotais e de um total geral sem que você tenha de escrever consultas UNION complexas.
Perguntas Frequentes
A aula “ROLLUP para subtotais” é grátis?
Sim — o texto completo de “ROLLUP para subtotais” é 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 “ROLLUP para subtotais”?
Subtotais correntes e totais gerais. 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 2 de 4.
Quanto tempo leva a aula “ROLLUP para subtotais”?
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