GROUPING SETS explicado
Escolha exatamente os agrupamentos desejados.
GROUPING SETS explicado é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 4 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 são conjuntos de agrupamento?
Quando você escreve uma cláusula GROUP BY, define um conjunto de colunas pelo qual deseja agrupar. Mas, às vezes, precisa de vários agrupamentos diferentes em uma única consulta — sem executar a consulta várias vezes e usar UNION ALL.
Conjuntos de agrupamento permitem especificar exatamente quais agrupamentos deseja, tudo em uma única passagem pelos dados. Cada conjunto da lista produz suas próprias linhas agregadas no resultado.
Tabela de exemplo: vendas
Usaremos uma tabela de vendas ao longo desta lição. Ela registra transações por região, categoria de produto e valor.
Execute o código para criar e preencher a tabela, para acompanhar cada exemplo.
CREATE TABLE sales (
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales VALUES
('East', 'Electronics', 500),
('East', 'Clothing', 200),
('West', 'Electronics', 300),
('West', 'Clothing', 400),
('North', 'Electronics', 150),
('North', 'Clothing', 250);A maneira antiga: UNION ALL
Antes da existência dos conjuntos de agrupamento, obter totais em vários níveis significava escrever consultas separadas e combiná-las usando UNION ALL. Isso é repetitivo, mais difícil de ler e percorre a tabela várias vezes.
O exemplo abaixo retorna os totais por região E os totais por categoria — usando três instruções SELECT separadas.
SELECT region, NULL AS category, SUM(amount) AS total
FROM sales
GROUP BY region
UNION ALL
SELECT NULL, category, SUM(amount)
FROM sales
GROUP BY category
UNION ALL
SELECT NULL, NULL, SUM(amount)
FROM sales;Sintaxe dos conjuntos de agrupamento
A cláusula de conjuntos de agrupamento é colocada dentro de um GROUP BY comum ou em seu lugar. Você lista cada agrupamento desejado como uma lista de colunas entre parênteses. Um conjunto vazio () representa o total geral — sem nenhum agrupamento.
Essa única consulta faz exatamente o que o UNION ALL de três partes acima fazia, mas de forma mais concisa e com uma única varredura da tabela.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region),
(category),
()
);Interpretando o resultado
Cada linha da saída pertence exatamente a um conjunto de agrupamento. Quando uma coluna não faz parte do conjunto de agrupamento ativo, seu valor é NULL.
- Uma linha com
region = 'East'ecategory = NULLpertence ao conjunto(region). - Uma linha com
region = NULLecategory = 'Electronics'pertence ao conjunto(category). - Uma linha em que ambas são NULL é o total geral do conjunto
().
Esses valores NULL são estruturais — significam “todos os valores” para aquela dimensão, não dados ausentes.
Conjuntos de agrupamento com várias colunas
Cada conjunto de agrupamento pode conter mais de uma coluna. O conjunto (region, category) agrupa pelas duas colunas em conjunto, assim como um GROUP BY region, category simples.
Combiná-lo com conjuntos individuais e o total geral fornece um resumo em quatro níveis em uma única consulta.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
(category),
()
);A função de agrupamento
Como NULL pode significar tanto “esta coluna não foi agrupada” quanto dados realmente ausentes, o SQL fornece a função de agrupamento para diferenciá-los.
GROUPING(col) retorna 1 quando a coluna foi omitida do conjunto de agrupamento atual (ou seja, seu NULL é estrutural) e 0 quando a coluna faz parte do agrupamento (ou contém um valor NULL real).
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_total,
GROUPING(category) AS is_category_total
FROM sales
GROUP BY GROUPING SETS (
(region),
(category),
()
);Substituindo rótulos NULL
Um padrão comum é substituir valores NULL estruturais por um rótulo descritivo, para facilitar a leitura dos relatórios. Use CASE WHEN agrupamento(...) = 1 THEN 'Todos ...' ELSE coluna END para substituir o rótulo apenas nas linhas de agregação.
SELECT
CASE WHEN GROUPING(region) = 1 THEN 'All Regions' ELSE region END AS region,
CASE WHEN GROUPING(category) = 1 THEN 'All Categories' ELSE category END AS category,
SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region),
(category),
()
);Conjuntos de agrupamento vs ROLLUP
ROLLUP(a, b) é uma forma abreviada que se expande para os conjuntos de agrupamento (a, b), (a), () — ele sempre adiciona subtotais seguindo uma hierarquia e o total geral.
Conjuntos de agrupamento oferecem controle total: você escolhe exatamente quais combinações aparecem. Se não precisar da hierarquia completa, pode omitir níveis. As duas consultas abaixo produzem a mesma saída.
-- Using ROLLUP
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),
()
);Conjuntos de agrupamento vs CUBE
CUBE(a, b) gera todas as combinações possíveis das colunas listadas: (a, b), (a), (b), (). Ele é útil para análises entre dimensões, mas produz muitas linhas.
Conjuntos de agrupamento permitem escolher apenas as combinações relevantes, mantendo o resultado focado e a consulta rápida.
-- CUBE produces 4 grouping sets for 2 columns
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category);
-- GROUPING SETS: omit the (category)-only set if not needed
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
);Caso de uso prático: painel de vendas
Um painel real geralmente precisa de detalhes no nível da linha, subtotais por departamento e um total geral, tudo no mesmo conjunto de resultados. Os conjuntos de agrupamento tornam isso simples, sem agregação no lado da aplicação nem múltiplas idas e voltas.
Esta consulta retorna linhas detalhadas por região e categoria, subtotais apenas por região e uma única linha de total geral — tudo ordenado para que o total geral apareça por último.
SELECT
COALESCE(region, 'TOTAL') AS region,
COALESCE(category, 'ALL') AS category,
SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
)
ORDER BY
GROUPING(region),
region NULLS LAST,
GROUPING(category),
category NULLS LAST;Verificação rápida
Teste sua compreensão sobre conjuntos de agrupamento.
Recapitulação da lição
Veja o que você aprendeu sobre conjuntos de agrupamento:
- Os conjuntos de agrupamento permitem definir várias combinações de agrupamento em uma única consulta, substituindo padrões repetitivos com UNION ALL.
- Cada conjunto é listado como uma lista de colunas entre parênteses dentro de
GROUP BY GROUPING SETS (...). Um conjunto vazio()produz o total geral. - As colunas que não estão no conjunto ativo aparecem como NULL nessa linha — use
GROUPING(col)para detectar esses valores NULL estruturais. - ROLLUP e CUBE são formas abreviadas convenientes para padrões comuns, mas os conjuntos de agrupamento oferecem controle total e preciso sobre quais agrupamentos são incluídos.
- Combine-os com COALESCE ou CASE WHEN GROUPING(...) para substituir valores NULL por rótulos legíveis nos relatórios.
Perguntas Frequentes
A aula “GROUPING SETS explicado” é grátis?
Sim — o texto completo de “GROUPING SETS explicado” é 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 “GROUPING SETS explicado”?
Escolha exatamente os agrupamentos desejados. 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 4 de 4.
Quanto tempo leva a aula “GROUPING SETS explicado”?
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