SQL Academy · Leçon

GROUPING SETS expliqué

Choisissez exactement les regroupements souhaités.

Leçon 4 sur 413 étapes

GROUPING SETS expliqué est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.

Que sont les GROUPING SETS ?

Lorsque vous écrivez une clause GROUP BY, vous définissez un ensemble de colonnes selon lequel effectuer le regroupement. Mais vous avez parfois besoin de plusieurs regroupements différents dans une seule requête — sans exécuter la requête plusieurs fois ni utiliser UNION ALL.

GROUPING SETS vous permet de préciser exactement les regroupements souhaités, en un seul parcours des données. Chaque ensemble de la liste produit ses propres lignes agrégées dans le résultat.

Table d'exemple : ventes

Nous utiliserons une table ventes tout au long de cette leçon. Elle enregistre les transactions par région, catégorie de produit et montant.

Exécutez le code pour créer et remplir la table afin de pouvoir suivre chaque exemple.

CREATE TABLE sales (
  region   TEXT,
  category TEXT,
  amount   NUMERIC
);

INSERT INTO sales VALUES
  ('East',  'Electronics', 500),
  ('East',  'Clothing',    200),
  ('West',  'Electronics', 300),
  ('West',  'Clothing',    400),
  ('North', 'Electronics', 150),
  ('North', 'Clothing',    250);

L'ancienne méthode : UNION ALL

Avant l'existence de GROUPING SETS, obtenir des totaux à plusieurs niveaux nécessitait d'écrire des requêtes distinctes et de les empiler avec UNION ALL. Cette méthode est répétitive, plus difficile à lire et parcourt la table plusieurs fois.

L'exemple ci-dessous renvoie les totaux par région ET les totaux par catégorie — à l'aide de trois instructions SELECT distinctes.

SELECT region, NULL AS category, SUM(amount) AS total
FROM sales
GROUP BY region

UNION ALL

SELECT NULL, category, SUM(amount)
FROM sales
GROUP BY category

UNION ALL

SELECT NULL, NULL, SUM(amount)
FROM sales;

Syntaxe de GROUPING SETS

La clause GROUPING SETS se place à l'intérieur d'un GROUP BY classique (ou à sa place). Vous indiquez chaque regroupement souhaité sous la forme d'une liste de colonnes entre parenthèses. Un ensemble vide () représente le total général — sans aucun regroupement.

Cette seule requête fait exactement ce que faisait le UNION ALL en trois parties ci-dessus, mais de manière plus concise et en un seul parcours de la table.

SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region),
  (category),
  ()
);

Lire le résultat

Chaque ligne du résultat appartient exactement à un ensemble de regroupement. Lorsqu'une colonne ne fait pas partie de l'ensemble de regroupement actif, sa valeur est NULL.

  • Une ligne avec region = 'East' et category = NULL appartient à l'ensemble (region).
  • Une ligne avec region = NULL et category = 'Electronics' appartient à l'ensemble (category).
  • Une ligne où les deux valeurs sont NULL correspond au total général de l'ensemble ().

Ces NULL sont structurels — ils signifient « toutes les valeurs » pour cette dimension, et non des données manquantes.

Ensembles de regroupement à plusieurs colonnes

Chaque ensemble de regroupement peut contenir plusieurs colonnes. L'ensemble (region, category) effectue le regroupement sur les deux colonnes ensemble, exactement comme un simple GROUP BY region, category.

En le combinant avec des ensembles individuels et le total général, vous obtenez un récapitulatif à quatre niveaux dans une seule requête.

SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  (category),
  ()
);

La fonction GROUPING()

Comme NULL peut signifier soit que « cette colonne n'a pas été regroupée », soit qu'il s'agit réellement de données manquantes, SQL fournit la fonction GROUPING() pour les distinguer.

GROUPING(col) renvoie 1 lorsque la colonne a été omise de l'ensemble de regroupement actuel (c'est-à-dire lorsque son NULL est structurel), et 0 lorsque la colonne fait partie du regroupement (ou contient une valeur NULL réelle).

SELECT
  region,
  category,
  SUM(amount)      AS total,
  GROUPING(region) AS is_region_total,
  GROUPING(category) AS is_category_total
FROM sales
GROUP BY GROUPING SETS (
  (region),
  (category),
  ()
);

Remplacer les libellés NULL

Une méthode courante consiste à remplacer les NULL structurels par un libellé descriptif afin de rendre les rapports plus faciles à lire. Utilisez CASE WHEN GROUPING(...) = 1 THEN 'Tous ...' ELSE col END pour substituer le libellé uniquement dans les lignes de sous-total.

SELECT
  CASE WHEN GROUPING(region)   = 1 THEN 'All Regions'    ELSE region   END AS region,
  CASE WHEN GROUPING(category) = 1 THEN 'All Categories' ELSE category END AS category,
  SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region),
  (category),
  ()
);

GROUPING SETS et ROLLUP

ROLLUP(a, b) est une notation abrégée qui se développe en ensembles de regroupement (a, b), (a), () — elle ajoute toujours les sous-totaux le long d'une hiérarchie ainsi que le total général.

GROUPING SETS vous donne un contrôle total : vous choisissez exactement les combinaisons qui apparaissent. Si vous n'avez pas besoin de toute la hiérarchie, vous pouvez omettre certains niveaux. Les deux requêtes ci-dessous produisent le même résultat.

-- Using ROLLUP
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category);

-- Equivalent explicit GROUPING SETS
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
);

GROUPING SETS et CUBE

CUBE(a, b) génère toutes les combinaisons possibles des colonnes indiquées : (a, b), (a), (b), (). Il est utile pour l'analyse entre dimensions, mais produit de nombreuses lignes.

GROUPING SETS vous permet de sélectionner uniquement les combinaisons qui vous intéressent, afin de conserver un résultat ciblé et une requête rapide.

-- CUBE produces 4 grouping sets for 2 columns
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category);

-- GROUPING SETS: omit the (category)-only set if not needed
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
);

Cas pratique : tableau de bord des ventes

Un véritable tableau de bord a souvent besoin du détail au niveau des lignes, des sous-totaux par service et d'un total général dans un seul ensemble de résultats. GROUPING SETS rend cela très simple, sans agrégation côté application ni allers-retours multiples.

Cette requête renvoie les lignes détaillées par région et catégorie, les sous-totaux par région uniquement et une seule ligne de total général — le tout trié de sorte que le total général apparaisse en dernier.

SELECT
  COALESCE(region,   'TOTAL')      AS region,
  COALESCE(category, 'ALL')        AS category,
  SUM(amount)                      AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
)
ORDER BY
  GROUPING(region),
  region NULLS LAST,
  GROUPING(category),
  category NULLS LAST;

Vérification rapide

Vérifiez votre compréhension de GROUPING SETS.

Récapitulatif de la leçon

Voici ce que vous avez appris sur GROUPING SETS :

  • GROUPING SETS vous permet de définir plusieurs combinaisons de regroupement dans une seule requête, en remplacement des constructions répétitives avec UNION ALL.
  • Chaque ensemble est indiqué sous la forme d'une liste de colonnes entre parenthèses dans GROUP BY GROUPING SETS (...). Un ensemble vide () produit le total général.
  • Les colonnes qui ne font pas partie de l'ensemble actif apparaissent sous la forme NULL dans cette ligne — utilisez GROUPING(col) pour détecter ces NULL structurels.
  • ROLLUP et CUBE sont des notations abrégées pratiques pour les modèles courants, mais GROUPING SETS vous offre un contrôle total et précis sur les regroupements inclus.
  • Combinez-les avec COALESCE ou CASE WHEN GROUPING(...) pour remplacer les NULL par des libellés lisibles dans les rapports.
Gratuit pour commencer

Apprends SQL avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
46
Leçons
183

Questions Fréquemment Posées

La leçon « GROUPING SETS expliqué » est-elle gratuite ?

Oui — le texte complet de « GROUPING SETS expliqué » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « GROUPING SETS expliqué » ?

Choisissez exactement les regroupements souhaités. Tu pratiques SQL Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer SQL Academy ?

Aucune expérience préalable n'est requise. SQL Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « GROUPING SETS expliqué » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon SQL Academy ?

Oui. Chaque leçon SQL Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Au-delà d’un seul GROUP BY
  2. ROLLUP pour les sous-totaux
  3. CUBE pour toutes les combinaisons
  4. GROUPING SETS expliqué
← Retour à SQL Academy