- Categorias:
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:
Sintaxe¶
SELECT ...
FROM ...
[ ... ]
GROUP BY CUBE ( groupCube [ , groupCube [ , ... ] ] )
[ ... ]
Onde:
groupCube ::= { <column_alias> | <position> | <expr> }
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');
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 | +-------+---------+--------+
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.