0Pricing
SQL Interview Prep · Leçon

Créer un tableau croisé avec une agrégation conditionnelle

Le motif portable CASE dans SUM pour transformer des lignes en colonnes

Créer un tableau croisé avec une agrégation conditionnelle est une leçon SQL Interview Prep 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 Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Interview Prep comprend 4 leçons au total.

Le contexte de l'entretien

L'une des tâches les plus courantes lors d'un entretien consacré à la production de rapports consiste à transformer des lignes en colonnes. Vous disposez d'une table longue comme sales(region, quarter, amount) et le recruteur souhaite un rapport au format large, avec une colonne par trimestre.

La réponse portable et indépendante du dialecte qu'il souhaite entendre est l'agrégation conditionnelle : une expression CASE placée dans une fonction d'agrégation telle que SUM. Maîtrisez cette technique et vous pourrez transposer des données dans n'importe quelle base de données, même celles qui ne disposent pas du mot-clé PIVOT.

Format long ou large

Avant d'effectuer une transposition, nommez les formats. Le format long stocke un fait par ligne : chaque paire région/trimestre constitue sa propre ligne. Le format large répartit une catégorie sur plusieurs colonnes.

  • Format long : facile à alimenter, difficile à lire côte à côte.
  • Format large : idéal pour un rapport destiné à être lu par des personnes.

Une transposition transforme le format long en format large. Les recruteurs apprécient cette question, car elle vérifie que vous comprenez l'agrégation et pas seulement la syntaxe.

-- Long form (the input)
region | quarter | amount
-------+---------+-------
East   | Q1      | 100
East   | Q2      | 150
West   | Q1      | 200
West   | Q2      | 250

Le modèle fondamental

L'astuce consiste à écrire, pour chaque colonne de résultat, un CASE qui renvoie la valeur lorsque la ligne correspond à cette colonne, et NULL dans le cas contraire. Placez-le dans une fonction d'agrégation afin que le regroupement se réduise à une seule ligne par clé.

Interprétez-le ainsi : additionnez le montant, mais uniquement pour les lignes du T1. Comme SUM ignore les NULL, les lignes qui ne correspondent pas ne contribuent pas au total.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;

Pourquoi SUM ignore NULL

Ce modèle fonctionne grâce à un fait sur lequel les recruteurs vous interrogeront : les fonctions d'agrégation ignorent les NULL. Un CASE sans clause ELSE renvoie NULL lorsqu'aucune branche ne correspond, de sorte que SUM(CASE WHEN ... THEN amount END) additionne uniquement les lignes sélectionnées.

Si vous écriviez ELSE 0, cela fonctionnerait également avec SUM (ajouter zéro ne change rien), mais ne fonctionnerait plus correctement avec AVG, MIN et COUNT.

-- Both produce the same SUM result:
SUM(CASE WHEN quarter = 'Q1' THEN amount END)
SUM(CASE WHEN quarter = 'Q1' THEN amount ELSE 0 END)

Exemple détaillé : rapport trimestriel

Voici la requête complète appliquée aux données d'exemple. Chaque région devient une ligne et chaque trimestre devient une colonne.

Le GROUP BY region est ce qui regroupe les quatre lignes d'entrée en deux lignes de sortie. Sans lui, vous obtiendriez une ligne par ligne d'entrée, avec principalement des NULL.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;

-- Result:
-- region | q1  | q2
-- East   | 100 | 150
-- West   | 200 | 250

Choisir le bon agrégat

L'agrégat qui englobe le CASE doit correspondre à la question :

  • SUM lorsque chaque cellule totalise des valeurs.
  • MAX ou MIN lorsque chaque paire région/trimestre possède exactement une valeur et que vous souhaitez simplement l'afficher.
  • COUNT lorsque chaque cellule compte les lignes correspondantes.

Les intervieweurs posent souvent la variante avec COUNT : combien de commandes par état et par mois ?

SELECT
  month,
  COUNT(CASE WHEN status = 'shipped' THEN 1 END) AS shipped,
  COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled
FROM orders
GROUP BY month;

MAX pour les cellules à valeur unique

Lorsque chaque paire clé/catégorie contient une seule valeur — un véritable tableau croisé, et non un total — utilisez MAX ou MIN. Les deux renvoient l'unique valeur non-NULL et ignorent les NULL provenant des branches non correspondantes.

C'est le choix sûr lorsque vous restructurez des attributs plutôt que d'additionner des montants, par exemple pour transformer une table de paramètres clé/valeur en une ligne par entité.

-- Turn key/value rows into one wide row per user
SELECT
  user_id,
  MAX(CASE WHEN attr = 'city'  THEN value END) AS city,
  MAX(CASE WHEN attr = 'plan'  THEN value END) AS plan
FROM user_attributes
GROUP BY user_id;

Gérer les cellules de sortie NULL

Si une région n'a enregistré aucune vente au T2, sa cellule q2 contient NULL. Les intervieweurs peuvent vous demander d'afficher 0 à la place. Englobe tout l'agrégat dans COALESCE.

Placez COALESCE à l'extérieur de l'agrégat, et non à l'intérieur du CASE, afin de ne remplacer la valeur que lorsque le groupe entier ne contient aucune ligne correspondante.

SELECT
  region,
  COALESCE(SUM(CASE WHEN quarter = 'Q1' THEN amount END), 0) AS q1,
  COALESCE(SUM(CASE WHEN quarter = 'Q2' THEN amount END), 0) AS q2
FROM sales
GROUP BY region;

Ajouter une colonne de total général

Une question complémentaire fréquente consiste à ajouter un total sur l'ensemble des colonnes issues du pivot. Vous n'avez pas besoin d'additionner les colonnes par leur nom. Un simple SUM(amount) sur le même groupe donne le total de la ligne, car il ignore entièrement le filtrage effectué par CASE.

Cela montre à l'intervieweur que vous comprenez que chaque agrégat du SELECT est calculé indépendamment sur le même groupe.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2,
  SUM(amount) AS total
FROM sales
GROUP BY region;

Le raccourci des agrégats filtrés

PostgreSQL et la norme SQL prennent en charge FILTER (WHERE ...), une manière plus claire d'écrire une agrégation conditionnelle. La syntaxe est plus lisible et évite le code répétitif de CASE.

Mentionnez cette possibilité lors d'un entretien pour montrer l'étendue de vos connaissances, mais sachez que MySQL et SQL Server ne la prennent pas en charge : CASE reste donc la solution portable.

-- Postgres / standard SQL
SELECT
  region,
  SUM(amount) FILTER (WHERE quarter = 'Q1') AS q1,
  SUM(amount) FILTER (WHERE quarter = 'Q2') AS q2
FROM sales
GROUP BY region;

La grande limitation

Les agrégations conditionnelles ont un piège sur lequel les intervieweurs insisteront : vous devez énumérer manuellement chaque colonne de sortie. Si les trimestres ou les catégories ne sont pas connus à l'avance, cette requête statique ne peut pas s'adapter.

Ce problème s'appelle un pivot dynamique et nécessite du SQL généré. Pour un ensemble fixe et connu de catégories, l'agrégation conditionnelle reste toutefois la meilleure solution, claire et portable.

Vérification rapide

Évaluez votre compréhension du modèle d'agrégation conditionnelle.

Récapitulatif

L'agrégation conditionnelle est le pivot portable accepté par tous les intervieweurs :

  • Un CASE par colonne de sortie, englobé dans un agrégat.
  • SUM pour les totaux, MAX/MIN pour les cellules à valeur unique, COUNT pour les comptages.
  • Fonctionne parce que les agrégats ignorent le NULL des branches non correspondantes.
  • Utilisez COALESCE pour transformer les cellules vides en 0.
  • Limitation : les colonnes doivent être codées en dur, ce qui mène ensuite aux pivots dynamiques.

Questions Fréquemment Posées

La leçon « Créer un tableau croisé avec une agrégation conditionnelle » est-elle gratuite ?

Oui — le texte complet de « Créer un tableau croisé avec une agrégation conditionnelle » 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 Interview Prep, passe à CoddyKit PRO. Le cours SQL Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Créer un tableau croisé avec une agrégation conditionnelle » ?

Le motif portable CASE dans SUM pour transformer des lignes en colonnes Tu pratiques SQL Interview Prep 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 Interview Prep ?

Aucune expérience préalable n'est requise. SQL Interview Prep 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 « Créer un tableau croisé avec une agrégation conditionnelle » ?

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 Interview Prep ?

Oui. Chaque leçon SQL Interview Prep 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. Créer un tableau croisé avec une agrégation conditionnelle
  2. Syntaxe PIVOT et des tableaux croisés selon le système
  3. Transformer des colonnes en lignes
  4. Tableaux croisés dynamiques avec des colonnes inconnues
← Retour à SQL Interview Prep