Categorias:

Sintaxe de consulta

GROUP BY CUBE

GROUP BY CUBE é uma extensão da cláusula GROUP BY semelhante a GROUP BY ROLLUP. Além de produzir todas as linhas de um GROUP BY ROLLUP, GROUP BY CUBE adiciona todas as linhas de “tabulações cruzadas”. Linhas de subtotal são linhas que agregam ainda mais, cujos valores são derivados do cálculo das mesmas funções agregadas que foram usadas para produzir as linhas agrupadas.

Um agrupamento CUBE é equivalente a uma série de conjuntos de agrupamentos e é essencialmente uma especificação mais curta. Os elementos N de uma especificação CUBE correspondem a 2^N GROUPING SETS.

Consulte também:

GROUP BY GROUPING SETS , GROUP BY ROLLUP

Sintaxe

SELECT ...
FROM ...
[ ... ]
GROUP BY CUBE ( groupCube [ , groupCube [ , ... ] ] )
[ ... ]
Copy

Onde:

groupCube ::= { <column_alias> | <position> | <expr> }
Copy
column_alias

Alias de coluna que aparece na lista SELECT do bloco de consulta.

position

Posição de uma expressão na lista SELECT.

expr

Qualquer expressão em tabelas no escopo atual.

Notas de uso

  • O Snowflake permite até 7 elementos (equivalentes a 128 conjuntos de agrupamento) em cada cubo.

Exemplos

Comece criando e carregando uma tabela com informações sobre as vendas de uma cadeia de lojas que possui filiais em diferentes cidades e estados/territórios.

-- Create some tables and insert some rows.
CREATE TABLE products (product_ID INTEGER, wholesale_price REAL);
INSERT INTO products (product_ID, wholesale_price) VALUES 
    (1, 1.00),
    (2, 2.00);

CREATE TABLE sales (product_ID INTEGER, retail_price REAL, 
    quantity INTEGER, city VARCHAR, state VARCHAR);
INSERT INTO sales (product_id, retail_price, quantity, city, state) VALUES 
    (1, 2.00,  1, 'SF', 'CA'),
    (1, 2.00,  2, 'SJ', 'CA'),
    (2, 5.00,  4, 'SF', 'CA'),
    (2, 5.00,  8, 'SJ', 'CA'),
    (2, 5.00, 16, 'Miami', 'FL'),
    (2, 5.00, 32, 'Orlando', 'FL'),
    (2, 5.00, 64, 'SJ', 'PR');
Copy

Executar uma consulta de cubo que mostra lucro por cidade, estado e total em todos os estados. O exemplo abaixo mostra uma consulta que tem três “níveis”:

  • Cada cidade.

  • Cada estado.

  • Todas as receitas combinadas.

Este exemplo usa ORDER BY state, city NULLS LAST para garantir que o rollup de cada estado venha imediatamente após todas as cidades daquele estado, e que o valor acumulado final apareça no fim da saída.

SELECT state, city, SUM((s.retail_price - p.wholesale_price) * s.quantity) AS profit 
 FROM products AS p, sales AS s
 WHERE s.product_ID = p.product_ID
 GROUP BY CUBE (state, city)
 ORDER BY state, city NULLS LAST
 ;
+-------+---------+--------+
| STATE | CITY    | PROFIT |
|-------+---------+--------|
| CA    | SF      |     13 |
| CA    | SJ      |     26 |
| CA    | NULL    |     39 |
| FL    | Miami   |     48 |
| FL    | Orlando |     96 |
| FL    | NULL    |    144 |
| PR    | SJ      |    192 |
| PR    | NULL    |    192 |
| NULL  | Miami   |     48 |
| NULL  | Orlando |     96 |
| NULL  | SF      |     13 |
| NULL  | SJ      |    218 |
| NULL  | NULL    |    375 |
+-------+---------+--------+
Copy

Algumas linhas de valor acumulado contêm valores NULL. Por exemplo, a última linha da tabela contém um valor NULL para a cidade e um valor NULL para o estado porque os dados são para todas as cidades e estados, não para uma cidade e estado específico.

Tanto GROUP BY CUBE como GROUP BY ROLLUP produzem uma linha para cada par de cidade/estado, e ambas as cláusulas GROUP BY também produzem linhas de valor acumulado para cada estado individual e para todos os estados combinados. A diferença entre as duas cláusulas GROUP BY é que GROUP BY CUBE também produz uma linha de saída para cada nome de cidade (‘Miami’, ‘SJ’ etc.).

Tenha cuidado ao usar GROUP BY CUBE nos dados hierárquicos. Neste exemplo, a linha para “SJ“ contém totais tanto para a cidade chamada “SJ” no estado de “CA” quanto para a cidade chamada “SJ” no território de “PR”, embora a única relação entre essas cidades seja que elas têm o mesmo nome. Em geral, usar GROUP BY ROLLUP para analisar dados hierárquicos, e GROUP BY CUBE para analisar dados através de eixos independentes.