0Pricing
Coding Interview Prep · Leçon

Syntaxe PIVOT et des tableaux croisés selon le système

PIVOT de SQL Server et crosstab de Postgres, ainsi que leurs limites

Syntaxe PIVOT et des tableaux croisés selon le système est une leçon Coding Interview Prep gratuite sur CoddyKit. Ceci est la leçon 2 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 Coding Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Coding Interview Prep comprend 4 leçons au total.

Au-delà de l'agrégation conditionnelle

Vous connaissez déjà le pivot portable avec CASE. Mais les intervieweurs veulent aussi savoir si vous pouvez utiliser les opérateurs de pivot propres à chaque éditeur lorsqu'ils sont disponibles.

SQL Server fournit un opérateur PIVOT dédié. PostgreSQL propose une fonction crosstab dans l'extension tablefunc. Les connaître tous les deux, ainsi que leurs pièges, témoigne d'une expérience concrète.

Structure de PIVOT dans SQL Server

Le PIVOT de SQL Server prend trois éléments :

  • Un agrégat appliqué à la colonne de valeurs.
  • Une clause FOR qui nomme la colonne dont les valeurs deviennent de nouvelles colonnes.
  • Une liste IN des valeurs littérales à transformer en colonnes.

Il doit être appliqué à une table dérivée qui présente exactement la clé, la colonne de répartition et la valeur, et rien de plus.

SELECT region, [Q1], [Q2]
FROM (SELECT region, quarter, amount FROM sales) AS src
PIVOT (
  SUM(amount)
  FOR quarter IN ([Q1], [Q2])
) AS p;

Le GROUP BY implicite

Les intervieweurs testent un piège subtil de PIVOT : le regroupement est implicite. SQL Server regroupe selon chaque colonne de la source qui n'est ni la colonne agrégée ni la colonne FOR.

Si votre table dérivée contient par erreur une colonne supplémentaire comme order_id, le pivot l'utilise également pour le regroupement et vous obtenez bien plus de lignes que prévu. Réduisez toujours la requête interne à la clé, à la colonne de répartition et à la valeur.

-- WRONG: order_id leaks in and breaks grouping
FROM (SELECT region, quarter, amount, order_id FROM sales) AS src
PIVOT (SUM(amount) FOR quarter IN ([Q1],[Q2])) AS p;
-- The pivot now groups by region AND order_id

Noms de colonnes entre crochets

Dans SQL Server, les noms des colonnes pivotées sont les valeurs littérales des données, entourées de crochets. Si une valeur commence par un chiffre ou contient des espaces, les crochets sont obligatoires.

Vous les sélectionnez en utilisant le même nom entre crochets dans le SELECT externe. C'est également pourquoi PIVOT ne peut pas gérer les valeurs inconnues sans SQL dynamique : la liste IN est codée en dur.

SELECT region, [2023], [2024]
FROM (SELECT region, yr, amount FROM sales) AS s
PIVOT (SUM(amount) FOR yr IN ([2023], [2024])) AS p;

crosstab de PostgreSQL

PostgreSQL ne possède pas de mot-clé PIVOT. À la place, l'extension tablefunc fournit crosstab, une fonction qui prend une chaîne SQL et restructure son résultat.

Vous devez d'abord activer l'extension. crosstab attend que la requête source renvoie exactement trois colonnes : l'identifiant de ligne, la catégorie et la valeur, dans cet ordre.

CREATE EXTENSION IF NOT EXISTS tablefunc;

SELECT *
FROM crosstab(
  'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);

La liste de définition des colonnes

La partie la plus sujette aux erreurs de crosstab est la liste finale de définition des colonnes AS ct(...). Vous devez déclarer vous-même les noms et les types des colonnes de sortie, qui doivent correspondre au nombre et à l'ordre des catégories.

Si une catégorie est absente pour une ligne, crosstab la place selon sa position, ce qui peut décaler les données, sauf si vous utilisez la forme à deux arguments présentée ci-dessous.

SELECT *
FROM crosstab(
  'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);
-- ct(...) MUST list every output column and its type

crosstab à deux arguments

Pour éviter les décalages lorsque certaines lignes ne possèdent pas certaines catégories, utilisez la forme à deux arguments. La seconde requête renvoie la liste complète et ordonnée des valeurs de catégorie, afin que crosstab sache exactement à quelle colonne chaque valeur appartient.

C'est la forme robuste attendue par les intervieweurs lorsque les catégories sont clairsemées.

SELECT *
FROM crosstab(
  'SELECT region, quarter, amount FROM sales ORDER BY 1, 2',
  'SELECT DISTINCT quarter FROM sales ORDER BY 1'
) AS ct(region text, q1 numeric, q2 numeric);

MySQL n'a ni l'un ni l'autre

Si l'intervieweur vous interroge sur MySQL, la réponse est directe : MySQL ne possède ni PIVOT ni crosstab. Votre seule possibilité est l'agrégation conditionnelle avec CASE — ou la forme abrégée SUM(... ) + IF().

C'est précisément pourquoi le modèle portable avec CASE est si apprécié : c'est le plus petit dénominateur commun qui fonctionne partout.

-- MySQL: only conditional aggregation works
SELECT
  region,
  SUM(IF(quarter = 'Q1', amount, 0)) AS q1,
  SUM(IF(quarter = 'Q2', amount, 0)) AS q2
FROM sales
GROUP BY region;

Exemple détaillé : comptage des états dans SQL Server

Une demande de rapport : « une ligne par région, avec une colonne comptant les commandes dans chaque état ». Dans SQL Server, alimentez PIVOT avec une table dérivée épurée en utilisant COUNT.

Comme vous comptez la colonne d'état elle-même, chaque ligne d'état non-NULL d'un groupe est comptabilisée. Le SELECT externe énumère chaque état sous forme de colonne entre crochets. C'est une alternative concise à l'écriture de trois expressions COUNT(CASE ...).

SELECT region, [pending], [shipped], [delivered]
FROM (SELECT region, status FROM orders) AS src
PIVOT (
  COUNT(status)
  FOR status IN ([pending], [shipped], [delivered])
) AS p;

Limitations communes

PIVOT et crosstab partagent la même limitation fondamentale que l'agrégation conditionnelle : les colonnes de sortie doivent être connues au moment où vous rédigez la requête.

  • SQL Server : la liste IN est littérale.
  • PostgreSQL avec crosstab : la liste de définition des colonnes est littérale.

Ni l'un ni l'autre ne peut découvrir les catégories au moment de l'exécution. Cela nécessite de construire dynamiquement la chaîne SQL.

Laquelle devez-vous utiliser ?

Une bonne réponse d'entretien les compare honnêtement :

  • Agrégation avec CASE : portable, lisible et fonctionnelle dans tous les moteurs. C'est le choix par défaut.
  • SQL Server PIVOT : concise pour de nombreuses colonnes, mais son regroupement implicite surprend souvent.
  • PostgreSQL crosstab : puissante, mais verbeuse, elle nécessite une extension et une liste de définition des colonnes.

En cas de doute, privilégiez l'agrégation conditionnelle et mentionnez les opérateurs propres aux éditeurs comme solutions alternatives.

Vérification rapide

Déterminez précisément le fonctionnement de SQL Server PIVOT sur lequel les intervieweurs vous interrogent.

Récapitulatif

La syntaxe de pivot propre aux éditeurs en un seul écran :

  • SQL Server : PIVOT (SUM(x) FOR col IN ([a],[b])), avec un GROUP BY implicite sur les colonnes restantes.
  • PostgreSQL : crosstab() de tablefunc, qui nécessite une liste de définition des colonnes ; utilisez la forme à deux arguments pour les données clairsemées.
  • MySQL : aucun des deux n'existe, utilisez CASE.
  • Dans les trois cas, les colonnes doivent être connues au moment de rédiger la requête.

Questions Fréquemment Posées

La leçon « Syntaxe PIVOT et des tableaux croisés selon le système » est-elle gratuite ?

Oui — le texte complet de « Syntaxe PIVOT et des tableaux croisés selon le système » 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 Coding Interview Prep, passe à CoddyKit PRO. Le cours Coding Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Syntaxe PIVOT et des tableaux croisés selon le système » ?

PIVOT de SQL Server et crosstab de Postgres, ainsi que leurs limites Tu pratiques Coding 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 Coding Interview Prep ?

Aucune expérience préalable n'est requise. Coding 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 2 sur 4.

Combien de temps prend la leçon « Syntaxe PIVOT et des tableaux croisés selon le système » ?

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

Oui. Chaque leçon Coding 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 à Coding Interview Prep