Catégories :

Syntaxe de requête

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 :

GROUP BY GROUPING SETS

Syntaxe

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

Où :

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

Alias de colonne figurant dans la liste SELECT du bloc de requête.

position

Position d’une expression dans la liste SELECT.

expr

Toute expression sur les tables du périmètre actuel.

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 un tableau contenant des informations sur les ventes d’une chaîne de magasins ayant des succursales dans différentes villes et é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 :

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)
 ;

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)
 ;
+-------+---------+--------+
| STATE | CITY    | PROFIT |
|-------+---------+--------|
| CA    | SF      |     13 |
| CA    | SJ      |     26 |
| FL    | Miami   |     48 |
| FL    | Orlando |     96 |
| PR    | SJ      |    192 |
| CA    | NULL    |     39 |
| FL    | NULL    |    144 |
| PR    | NULL    |    192 |
| NULL  | NULL    |    375 |
| NULL  | SF      |     13 |
| NULL  | SJ      |    218 |
| NULL  | Miami   |     48 |
| NULL  | Orlando |     96 |
+-------+---------+--------+