SQL - C’est quoi GROUPINGS SETS sur BigQuery?

SQL - C’est quoi GROUPINGS SETS sur BigQuery?

Date de sortie
November 5, 2024
Auteur
Bertrand Fabre
“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 !