0Pricing
SQL Academy · Aula

CUBE para todas as combinações

Todas as combinações de agrupamento de uma só vez.

CUBE para todas as combinações é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 3 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 é CUBE

A extensão CUBE do SQL gera todas as combinações possíveis de agrupamento a partir de uma lista de colunas. Enquanto ROLLUP cria uma hierarquia, CUBE produz um produto cartesiano completo de subtotais — incluindo o total geral.

Pense nele como uma forma de responder: “Calcule todos os subtotais possíveis a partir dessas colunas.”

Preparando a tabela

Usaremos uma tabela sales que acompanha a receita por ano, região e categoria de produto. Esse tipo de dado multidimensional é onde CUBE é especialmente útil.

CREATE TABLE sales (
  year     INT,
  region   VARCHAR(20),
  category VARCHAR(20),
  revenue  NUMERIC(10,2)
);

INSERT INTO sales VALUES
  (2023, 'North', 'Electronics', 12000),
  (2023, 'North', 'Clothing',     8000),
  (2023, 'South', 'Electronics',  9500),
  (2023, 'South', 'Clothing',     6000),
  (2024, 'North', 'Electronics', 14000),
  (2024, 'North', 'Clothing',     9500),
  (2024, 'South', 'Electronics', 11000),
  (2024, 'South', 'Clothing',     7200);

Sua primeira consulta CUBE

A sintaxe é simples: substitua GROUP BY por GROUP BY CUBE(...) e liste as colunas dentro dos parênteses. O SQL gerará todas as combinações dessas colunas como conjuntos de agrupamento.

SELECT
  year,
  region,
  category,
  SUM(revenue) AS total_revenue
FROM sales
GROUP BY CUBE(year, region, category)
ORDER BY year, region, category;

Quantos agrupamentos CUBE produz

Para n colunas, CUBE produz 2n conjuntos de agrupamento — um para cada subconjunto da lista de colunas, incluindo o conjunto vazio (o total geral).

Com 3 colunas (ano, região, categoria), isso corresponde a 2³ = 8 conjuntos de agrupamento: cada coluna isoladamente, cada par, as três juntas e nenhuma delas.

-- 3 columns => 8 grouping sets:
-- (year, region, category)
-- (year, region)
-- (year, category)
-- (region, category)
-- (year)
-- (region)
-- (category)
-- () <- grand total
SELECT COUNT(*) AS row_count
FROM (
  SELECT year, region, category, SUM(revenue)
  FROM sales
  GROUP BY CUBE(year, region, category)
) sub;

NULLs indicam a dimensão resumida

Assim como ROLLUP, CUBE usa NULL para indicar que uma coluna foi agregada. Se region for NULL em uma linha do resultado, essa linha resume todas as regiões para aquela combinação das colunas restantes.

Use GROUPING(col) para distinguir um valor NULL real de um marcador de agregação.

SELECT
  GROUPING(year)     AS g_year,
  GROUPING(region)   AS g_region,
  GROUPING(category) AS g_category,
  year,
  region,
  category,
  SUM(revenue) AS total_revenue
FROM sales
GROUP BY CUBE(year, region, category)
ORDER BY g_year, g_region, g_category;

Tornando os NULLs legíveis com COALESCE

Para tornar a saída mais legível nos relatórios, envolva cada coluna agrupada em COALESCE, substituindo o NULL de agregação por um rótulo descritivo, como 'ALL'.

SELECT
  COALESCE(CAST(year AS VARCHAR), 'ALL YEARS')     AS year,
  COALESCE(region,   'ALL REGIONS')                AS region,
  COALESCE(category, 'ALL CATEGORIES')             AS category,
  SUM(revenue)                                     AS total_revenue
FROM sales
GROUP BY CUBE(year, region, category)
ORDER BY year, region, category;

CUBE versus ROLLUP — principal diferença

ROLLUP(a, b, c) cria subtotais apenas ao longo de uma hierarquia: (a,b,c), (a,b), (a), (). Ele respeita a ordem da esquerda para a direita.

CUBE(a, b, c) cria todos os subconjuntos — incluindo combinações como (a,c) ou apenas (b) — que ROLLUP ignora completamente. Use CUBE quando precisar de uma análise multidimensional completa, sem uma hierarquia predeterminada.

-- ROLLUP: 4 grouping sets
SELECT year, region, SUM(revenue)
FROM sales
GROUP BY ROLLUP(year, region);

-- CUBE: 4 grouping sets for 2 columns (same count here)
-- but adds the (region) subtotal that ROLLUP omits
SELECT year, region, SUM(revenue)
FROM sales
GROUP BY CUBE(year, region);

CUBE parcial

Você pode combinar colunas regulares de GROUP BY com uma sublista de CUBE. As colunas listadas fora de CUBE(...) estão sempre presentes em todos os conjuntos de agrupamento, enquanto apenas as colunas dentro dele recebem o tratamento de todas as combinações.

-- year is fixed; CUBE only over region and category
SELECT
  year,
  COALESCE(region,   'ALL REGIONS')    AS region,
  COALESCE(category, 'ALL CATEGORIES') AS category,
  SUM(revenue) AS total_revenue
FROM sales
GROUP BY year, CUBE(region, category)
ORDER BY year, region, category;

Filtragem com HAVING nos resultados de CUBE

HAVING funciona com a saída de CUBE exatamente como funciona com um GROUP BY comum. Você pode excluir as linhas de agrupamento cujo valor agregado não atinja um limite — por exemplo, mantendo apenas as linhas em que a receita total ultrapasse um mínimo.

SELECT
  COALESCE(region,   'ALL REGIONS')    AS region,
  COALESCE(category, 'ALL CATEGORIES') AS category,
  SUM(revenue) AS total_revenue
FROM sales
GROUP BY CUBE(region, category)
HAVING SUM(revenue) > 15000
ORDER BY total_revenue DESC;

Combinando CUBE com funções de janela

Você pode envolver uma consulta com CUBE em uma CTE e, em seguida, aplicar funções de janela para classificar ou comparar linhas dentro do resultado. Esse é um padrão poderoso para criar painéis destinados a executivos.

WITH cube_result AS (
  SELECT
    COALESCE(region,   'ALL') AS region,
    COALESCE(category, 'ALL') AS category,
    SUM(revenue) AS total_revenue
  FROM sales
  GROUP BY CUBE(region, category)
)
SELECT
  region,
  category,
  total_revenue,
  RANK() OVER (ORDER BY total_revenue DESC) AS revenue_rank
FROM cube_result
ORDER BY revenue_rank;

Quando escolher CUBE

CUBE é a ferramenta certa quando:

  • Você precisa de todas as combinações de subtotais para um relatório ad hoc ou no estilo OLAP.
  • Não existe uma hierarquia natural entre as colunas de agrupamento.
  • Você quer permitir que os analistas dividam os dados da maneira que escolherem.

Evite CUBE quando o número de colunas for grande — 4 colunas já produzem 16 conjuntos de agrupamento, e 5 produzem 32. Prefira ROLLUP ou GROUPING SETS explícitos para manter os conjuntos de resultados gerenciáveis.

Verificação rápida

Quantos conjuntos de agrupamento distintos GROUP BY CUBE(a, b, c, d) produz?

Recapitulação da lição

Nesta lição, você aprendeu como CUBE gera todas as combinações possíveis de conjuntos de agrupamento a partir de uma lista de colunas, sendo ideal para relatórios multidimensionais.

Principais pontos:

  • GROUP BY CUBE(a, b, c) produz 2n conjuntos de agrupamento.
  • NULL em uma coluna do resultado significa que aquela dimensão foi agregada; use GROUPING() para detectá-lo.
  • COALESCE transforma valores NULL da agregação em rótulos significativos.
  • Um CUBE parcial (por exemplo, GROUP BY year, CUBE(region, category)) fixa algumas colunas e aplica o cubo apenas às restantes.
  • Use CUBE para análises ad hoc completas; prefira ROLLUP ou GROUPING SETS explícitos quando a hierarquia for conhecida ou o número de colunas for grande.

Perguntas Frequentes

A aula “CUBE para todas as combinações” é grátis?

Sim — o texto completo de “CUBE para todas as combinações” é 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 “CUBE para todas as combinações”?

Todas as combinações de agrupamento de uma só vez. 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 3 de 4.

Quanto tempo leva a aula “CUBE para todas as combinações”?

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

  1. Além de um único GROUP BY
  2. ROLLUP para subtotais
  3. CUBE para todas as combinações
  4. GROUPING SETS explicado
← Voltar para SQL Academy