“Hey Bertrand ! J’ai lu ton article à propos de GROUP BY CUBE() et j’ai vu ta vidéo pour l’utilisation de GROUP BY ROLLUP, mais je voudrai être plus flexible sur les combinaisons d’agrégation à faire. Tu connais quelque chose ?”
Effectivement, sur BigQuery il existe un groupement spécial permettant d’avoir un choix plus fin sur vos combinaisons d’agrégation.
Vous pouvez utiliser, GROUP BY GROUPING SETS().
Avec GROUPING SETS() il est possible d’indiquer explicitement les combinaisons voulues : faire une agrégation sur toutes les combinaisons de deux colonnes, faire une agrégation sur deux champs distincts, ou juste faire le total.
La syntaxe
SELECT
colonne1,
colonne2,
AGGREGATE_FUNCTION(colonne3) AS superNomDuResultat
FROM unNomDeTable
GROUP BY GROUPING SETS (
(colonne1, colonne2), -- Toutes les combinaisons entre les deux colonnes
(colonne1), -- Agrégation sur colonne1
(colonne2), -- Agrégation sur colonne2
() -- Calcul du total
);
Peut-être qu’un cas concret avec des données serait plus explicite.
Les données
region | day | site | brand | size | amount |
Est | 2024-10-02 | 169 | Buchan | S | 18.84 |
Est | 2024-10-02 | 167 | Leclercq | S | 12.71 |
Nord-Est | 2024-10-01 | 177 | Correfour | S | 12.87 |
Est | 2024-10-02 | 179 | Buchan | S | 11.1 |
Ce sont les ventes de chaussettes de différentes grandes marques “fictives” de retail.
Ceci n’est qu’une échantillon. La table réelle contient 100 lignes.
Ce que l’on voudrait c’est faire obtenir le total des ventes des marques de grande distribution, le total des ventes par marque et les ventes par marque associées à la taille de la chaussette, donc 3 façons d’agréger.
SELECT
brand,
size,
SUM(amount) AS salesAmount
FROM
datayoka-dev.DEMO.F_socksSales
GROUP BY GROUPING SETS(
(brand, size), -- ventes par marque associé à la taille de la chaussette
(brand), -- total des ventes par marque
() -- total des ventes des marques de grande distribution
)
ORDER BY brand;
Grâce à cette requête voici le résultat :
brand | size | salesAmount |
NULL | NULL | 1458.05 |
Buchan | NULL | 430.60 |
Buchan | S | 188.88 |
Buchan | XL | 241.72 |
Correfour | NULL | 355.63 |
Correfour | S | 181.19 |
Correfour | XL | 174.44 |
Leclercq | NULL | 671.82 |
Leclercq | XL | 335.15 |
Leclercq | S | 336.67 |
💪 On voit bien la répartition des ventes selon ce qui est indiqué dans le GROUPING SETS().
Lorsque la valeur est NULL cela signifie que ce champ n’a pas été pris en compte comme niveau d’agrégation.
Interprétation
- Les ventes totales du marché sur la période étudiée s’élèvent à 1458,05€ (1ère ligne) ;
- Buchan a généré 430,60€ de CA sur la période étudiée (2ème ligne) ;
- Correfour a vendu pour 174,44€ de chaussettes en taille XL sur la période étudiée (7ème ligne).
Merci de votre lecture !