- Catégories :
GROUP BY CUBE¶
GROUP BY CUBE est une extension de la clause GROUP BY similaire à GROUP BY ROLLUP. En plus de produire toutes les lignes d’un GROUP BY ROLLUP, GROUP BY CUBE ajoute toutes les lignes de « tabulations croisées ». Les lignes de sous-totaux sont des lignes qui s’agrégent encore, dont les valeurs sont dérivées en calculant les mêmes fonctions d’agrégation que celles qui ont été utilisées pour produire les lignes groupées.
Un groupement CUBE équivaut à une série d’ensembles de regroupement et constitue essentiellement une spécification plus courte. Les éléments N
d’une spécification CUBE correspondent à 2^N GROUPING SETS
.
- Voir aussi :
Syntaxe¶
SELECT ...
FROM ...
[ ... ]
GROUP BY CUBE ( groupCube [ , groupCube [ , ... ] ] )
[ ... ]
Où :
groupCube ::= { <column_alias> | <position> | <expr> }
Notes sur l’utilisation¶
Snowflake autorise jusqu’à 7 éléments (équivalent à 128 ensembles de regroupement) dans chaque cube.
Exemples¶
Commencez par créer et charger une table contenant des informations sur les ventes d’une chaîne de magasins ayant des succursales dans différentes villes et différents états ou régions/territoires.
-- 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');
Exécutez une requête de cube qui affiche les bénéfices par ville, état et total dans tous les états. L’exemple ci-dessous montre une requête qui a trois « niveaux » :
chaque ville.
chaque région.
Tous revenus confondus.
Cet exemple utilise ORDER BY state, city NULLS LAST
pour s’assurer que le cumul de chaque état vient immédiatement après toutes les villes de cet état, et que le cumul final apparaît à la fin de la sortie.
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 | +-------+---------+--------+
Certaines lignes du rollup contiennent des valeurs NULL. Par exemple, la dernière ligne de la table contient une valeur NULL pour la ville et une valeur NULL pour l’État, car les données concernent toutes les villes et tous les États, et non une ville et un État spécifiques.
Les clauses GROUP BY CUBE
et GROUP BY ROLLUP
produisent une ligne pour chaque paire ville/état, et les deux clauses GROUP BY
produisent également des lignes de rollup pour chaque état individuel et pour tous les états combinés. La différence entre les deux clauses GROUP BY
est que GROUP BY CUBE
produit également une ligne de sortie pour chaque nom de ville (“Miami”, “SJ”, etc.).
Soyez prudent en utilisant GROUP BY CUBE
sur des données hiérarchiques. Dans cet exemple, la ligne pour « SJ » contient des totaux pour la ville nommée « SJ » dans l’état de « CA » et la ville nommée « SJ » dans le territoire de « PR », même si la seule relation entre ces villes est qu’elles portent le même nom. En général, utilisez GROUP BY ROLLUP
pour analyser des données hiérarchiques, et GROUP BY CUBE
pour analyser des données sur des axes indépendants.