0Pricing
SQL Academy · Leçon

Au-delà d’un seul GROUP BY

Agrégerez à plusieurs niveaux.

Au-delà d’un seul GROUP BY est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 1 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.

La limite d’un seul GROUP BY

Une clause GROUP BY standard vous permet d’agréger les lignes à un niveau précis — par exemple, le total des ventes par région. Mais que faire si vous souhaitez également obtenir les totaux par catégorie de produits et un total général, le tout dans la même requête ?

Répéter la requête trois fois et utiliser UNION ALL fonctionne, mais c’est verbeux et lent. SQL propose trois extensions puissantes — GROUPING SETS, ROLLUP et CUBE — qui résolvent élégamment ce problème en un seul parcours.

SELECT region, SUM(amount) AS total_sales
FROM sales
GROUP BY region;

Configuration de la table d'exemple

Tout au long de cette leçon, nous utiliserons une simple table sales qui enregistre chaque vente avec une région, une catégorie et un montant. Nous allons la créer et la remplir afin que chaque requête à venir soit compréhensible dans son contexte.

CREATE TABLE sales (
  id       SERIAL PRIMARY KEY,
  region   TEXT,
  category TEXT,
  amount   NUMERIC
);

INSERT INTO sales (region, category, amount) VALUES
  ('North', 'Electronics', 1200),
  ('North', 'Clothing',     800),
  ('South', 'Electronics',  950),
  ('South', 'Clothing',     600),
  ('East',  'Electronics', 1100),
  ('East',  'Clothing',     750);

Que sont les GROUPING SETS ?

GROUPING SETS vous permet de définir plusieurs niveaux de regroupement indépendants dans une seule clause GROUP BY. Chaque ensemble de la liste produit son propre groupe de lignes, comme si vous aviez écrit des requêtes distinctes et les aviez combinées avec UNION ALL.

La syntaxe est la suivante : GROUP BY GROUPING SETS ( (col1, col2), (col1), () ). L'ensemble vide () représente le total général de toutes les lignes.

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

Lire le résultat de GROUPING SETS

Lorsque vous exécutez une requête GROUPING SETS, les lignes correspondant à différents niveaux de regroupement sont rassemblées. Les colonnes qui ne font pas partie d'un ensemble donné apparaissent sous la forme de NULL dans la ligne correspondante.

Par exemple, une ligne appartenant à l'ensemble (region) contiendra NULL dans la colonne category, ce qui indique que ce total couvre toutes les catégories de cette région. La ligne du total général (l'ensemble vide) contient NULL dans region et category.

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

Présentation de ROLLUP

ROLLUP est un raccourci pour une hiérarchie courante d'ensembles de regroupement. Pour les colonnes (A, B), ROLLUP(A, B) génère automatiquement les ensembles suivants : (A, B), (A) et ().

C'est idéal pour les données hiérarchiques, comme le passage de l'année au mois puis au jour, ou de la région à la catégorie. Le nombre d'ensembles produits est toujours égal à n + 1, où n est le nombre de colonnes répertoriées.

-- ROLLUP(region, category) is equivalent to:
-- GROUPING SETS ( (region, category), (region), () )

SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;

ROLLUP à trois niveaux

L'ajout d'une troisième colonne à ROLLUP étend la hiérarchie d'un niveau supplémentaire. ROLLUP(A, B, C) génère quatre ensembles : (A, B, C), (A, B), (A) et ().

Dans l'exemple ci-dessous, year est le niveau le plus externe et category le niveau le plus détaillé. La requête produit des sous-totaux à chaque étape de la hiérarchie, ainsi qu'une ligne de total général.

SELECT
  year,
  region,
  category,
  SUM(amount) AS total
FROM (
  VALUES
    (2024, 'North', 'Electronics', 1200),
    (2024, 'North', 'Clothing',     800),
    (2024, 'South', 'Electronics',  950),
    (2025, 'North', 'Electronics', 1400),
    (2025, 'South', 'Clothing',     700)
) AS t(year, region, category, amount)
GROUP BY ROLLUP(year, region, category)
ORDER BY year NULLS LAST, region NULLS LAST, category NULLS LAST;

Présentation de CUBE

CUBE est encore plus étendu que ROLLUP. Pour n colonnes, il génère les 2^n combinaisons possibles d'ensembles de regroupement, y compris le total général.

Pour CUBE(region, category), les ensembles produits sont les suivants : (region, category), (region), (category) et () — soit quatre ensembles au total. Cette fonction est utile lorsque vous souhaitez obtenir les totaux de chaque croisement possible, et pas seulement selon une hiérarchie unique.

-- CUBE(region, category) produces:
-- GROUPING SETS ( (region,category), (region), (category), () )

SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;

CUBE ou ROLLUP — lequel choisir

Choisissez selon que vos dimensions possèdent ou non une hiérarchie naturelle :

  • Utilisez ROLLUP lorsque les colonnes sont hiérarchiques (par exemple, du pays à la ville puis au magasin). Les sous-totaux suivent un seul chemin hiérarchique.
  • Utilisez CUBE lorsque les colonnes sont des dimensions indépendantes (par exemple, la région et la catégorie) et que vous souhaitez obtenir tous les croisements possibles.
  • Utilisez GROUPING SETS lorsque vous avez besoin d'un contrôle total et que ni ROLLUP ni CUBE ne correspondent exactement à vos exigences.

La fonction GROUPING()

Comme NULL peut représenter soit une valeur manquante réelle, soit un marqueur de regroupement, SQL fournit la fonction GROUPING(). Elle renvoie 1 lorsque la colonne fait partie d'une ligne de super-agrégat (marqueur), et 0 lorsque la colonne a effectivement servi au regroupement.

Vous pouvez ainsi distinguer une région réellement égale à NULL d'une ligne de sous-total couvrant toutes les régions.

SELECT
  region,
  category,
  SUM(amount)        AS total,
  GROUPING(region)   AS is_region_subtotal,
  GROUPING(category) AS is_category_subtotal
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;

Utiliser GROUPING() pour étiqueter les lignes

Une construction courante consiste à associer GROUPING() à une expression CASE afin de produire des étiquettes compréhensibles par les utilisateurs plutôt que des valeurs NULL brutes. Le résultat d'une requête ROLLUP ou CUBE est ainsi beaucoup plus facile à lire dans les rapports.

SELECT
  CASE GROUPING(region)
    WHEN 1 THEN 'Grand Total'
    ELSE region
  END AS region_label,
  CASE GROUPING(category)
    WHEN 1 THEN 'All Categories'
    ELSE category
  END AS category_label,
  SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY GROUPING(region), region, GROUPING(category), category;

Combiner des colonnes fixes avec ROLLUP

Vous pouvez combiner des colonnes ordinaires de GROUP BY avec ROLLUP ou CUBE dans la même clause. Les colonnes répertoriées en dehors de ROLLUP(...) sont toujours incluses dans chaque ensemble de regroupement : elles ne font jamais l'objet d'un regroupement à un niveau supérieur.

Dans la requête ci-dessous, year est une colonne de regroupement fixe, tandis que region et category participent au regroupement par niveaux. Vous obtenez donc des sous-totaux pour chaque année, et non pour l'ensemble des années.

SELECT
  2024           AS year,
  region,
  category,
  SUM(amount)    AS total
FROM sales
GROUP BY 2024, ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;

Vérification rapide

Évaluez votre compréhension de GROUPING SETS, ROLLUP et CUBE.

Récapitulatif — au-delà d'un seul GROUP BY

Dans cette leçon, vous avez découvert trois extensions SQL puissantes qui permettent de produire plusieurs niveaux d'agrégation dans une seule requête :

  • GROUPING SETS — un contrôle manuel total : répertoriez exactement les combinaisons dont vous avez besoin.
  • ROLLUP — idéal pour les hiérarchies : il remonte du niveau le plus détaillé jusqu'au total général.
  • CUBE — génère tous les croisements possibles des dimensions répertoriées.

Vous avez également appris que GROUPING() distingue les valeurs NULL réelles des lignes de super-agrégat servant de marqueurs, et que les constructions CASE GROUPING(...) produisent un résultat de rapport propre et lisible.

Ces outils sont indispensables dès que vous devez créer des synthèses multidimensionnelles : les rapports de type tableau croisé, les tableaux de bord et les requêtes d'entrepôt de données reposent largement sur eux.

Questions Fréquemment Posées

La leçon « Au-delà d’un seul GROUP BY » est-elle gratuite ?

Oui — le texte complet de « Au-delà d’un seul GROUP BY » 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 « Au-delà d’un seul GROUP BY » ?

Agrégerez à plusieurs niveaux. 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 1 sur 4.

Combien de temps prend la leçon « Au-delà d’un seul GROUP BY » ?

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