Transformer des colonnes en lignes
Inverser des tables larges avec UNPIVOT ou UNION ALL
Transformer des colonnes en lignes est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 3 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 problème inverse
Le dé-pivotage est l'image miroir du pivotage : vous prenez une table large et transformez ses colonnes en lignes. Les intervieweurs posent cette question lorsque les données arrivent sous forme de feuille de calcul, mais doivent être normalisées pour l'analyse.
Exemple : une table contenant les colonnes q1, q2, q3, q4 pour chaque région doit devenir des lignes de la forme (region, quarter, amount). Ce format long est celui que préfèrent les agrégations, les jointures et la création de graphiques.
-- Wide input we want to unpivot
region | q1 | q2 | q3 | q4
-------+-----+-----+-----+----
East | 100 | 150 | 120 | 180
West | 200 | 250 | 210 | 260Le modèle portable avec UNION ALL
La réponse indépendante du dialecte est UNION ALL : écrivez un SELECT par colonne source, chacun produisant une étiquette littérale et la valeur de cette colonne.
Utilisez UNION ALL, et non UNION, afin de ne pas payer le coût de la déduplication et de conserver chaque ligne, même lorsque deux cellules contiennent la même valeur.
SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
UNION ALL
SELECT region, 'Q2', q2 FROM wide_sales
UNION ALL
SELECT region, 'Q3', q3 FROM wide_sales
UNION ALL
SELECT region, 'Q4', q4 FROM wide_sales;Pourquoi UNION ALL plutôt que UNION
C'est un piège classique des entretiens. UNION supprime les lignes en double dans l'ensemble du résultat. Si l'Est et l'Ouest avaient tous deux 100 pour le T1, un simple UNION fusionnerait les lignes identiques et vous perdriez des données.
UNION ALL concatène les résultats sans dédoublonnage, ce dont le dé-pivotage a besoin. C'est également plus rapide, car aucun tri ni hachage n'est nécessaire pour supprimer les doublons.
-- UNION would wrongly merge identical (region, quarter, amount) rows
-- UNION ALL keeps every row, always the correct choice hereAlignement des types de colonnes
Chaque branche de UNION ALL doit produire le même nombre de colonnes, avec des types compatibles et dans le même ordre. Les noms des colonnes proviennent du premier SELECT.
Si vos colonnes larges diffèrent par leur type — par exemple si l'une est de type int et l'autre de type decimal — le moteur choisit un type commun. Si elles sont réellement incompatibles, effectuez une conversion explicite afin que l'opération de fusion n'échoue pas.
SELECT region, 'revenue' AS metric, CAST(revenue AS decimal(12,2)) AS val FROM t
UNION ALL
SELECT region, 'units', CAST(units AS decimal(12,2)) FROM t;UNPIVOT dans SQL Server
SQL Server possède un opérateur UNPIVOT dédié, plus concis que UNION ALL. Vous indiquez le nom de la nouvelle colonne de valeurs, celui de la nouvelle colonne d'étiquettes et vous énumérez les colonnes sources à regrouper.
Un comportement important : UNPIVOT supprime les lignes dont la valeur est NULL. Les intervieweurs vérifient que vous connaissez cet effet secondaire.
SELECT region, quarter, amount
FROM wide_sales
UNPIVOT (
amount FOR quarter IN (q1, q2, q3, q4)
) AS u;UNPIVOT supprime les NULL
Si une région contient NULL dans q3, l'UNPIVOT de SQL Server omet simplement cette ligne de la sortie. Si vous avez besoin d'une ligne pour chaque colonne, quelles que soient les valeurs NULL, utilisez la solution de repli UNION ALL, qui les conserve.
Présentez clairement ce compromis lors d'un entretien : l'UNPIVOT natif est concis, mais perd les valeurs NULL ; UNION ALL est verbeux, mais complet.
-- UNPIVOT: q3 NULL for East -> no (East, Q3) row produced
-- UNION ALL: (East, 'Q3', NULL) row IS producedPostgreSQL : LATERAL VALUES
PostgreSQL ne possède pas d'UNPIVOT, mais une syntaxe élégante consiste à utiliser CROSS JOIN LATERAL sur une liste de VALUES. Chaque ligne large est développée avec une petite table intégrée de paires (étiquette, valeur).
C'est plus clair qu'un long UNION ALL et la table source n'est lue qu'une seule fois.
SELECT w.region, v.quarter, v.amount
FROM wide_sales w
CROSS JOIN LATERAL (VALUES
('Q1', w.q1),
('Q2', w.q2),
('Q3', w.q3),
('Q4', w.q4)
) AS v(quarter, amount);Lire la table une seule fois
Un point de performance qui mérite d'être mentionné : le UNION ALL naïf parcourt la table large une fois par branche, soit quatre parcours pour quatre trimestres. La forme avec LATERAL VALUES, ainsi que l'UNPIVOT de SQL Server, lit la source une seule fois.
Sur les grandes tables, cela compte. Si vous devez utiliser UNION ALL, un optimiseur peut tout de même effectuer plusieurs parcours : mentionnez donc LATERAL ou UNPIVOT comme options plus efficaces.
Filtrer les cellules vides
Avec UNION ALL ou LATERAL, vous conservez les lignes dont la valeur est NULL. Si la question porte uniquement sur les cellules renseignées, ajoutez un filtre. Cela reproduit ce que l'UNPIVOT de SQL Server fait automatiquement.
Décider de conserver ou de supprimer les NULL relève du jugement : clarifiez donc cette exigence avec l'intervieweur avant de coder.
SELECT region, quarter, amount
FROM (
SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
UNION ALL SELECT region, 'Q2', q2 FROM wide_sales
) t
WHERE amount IS NOT NULL;Exemple guidé : agrégation après dé-pivotage
Une question fréquente en complément consiste à demander : « à partir de la table trimestrielle au format large, donnez le chiffre d'affaires total par région pour tous les trimestres ». Une fois les données dé-pivotées en forme longue, l'agrégation est triviale : un seul SUM regroupé par région.
Cela montre la véritable raison de dé-pivoter d'abord. Additionner quatre colonnes distinctes est fragile, tandis qu'un SUM(amount) GROUP BY region en forme longue s'adapte à n'importe quel nombre de trimestres.
WITH long_sales AS (
SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
UNION ALL SELECT region, 'Q2', q2 FROM wide_sales
UNION ALL SELECT region, 'Q3', q3 FROM wide_sales
UNION ALL SELECT region, 'Q4', q4 FROM wide_sales
)
SELECT region, SUM(amount) AS total
FROM long_sales
GROUP BY region;Quand dé-pivoter
Repérez le signal indiquant qu'il faut dé-pivoter dans un énoncé :
- L'entrée comporte des colonnes répétées qui représentent en réalité des valeurs (mois, années, indicateurs).
- Vous devez agréger, joindre ou représenter graphiquement ces valeurs.
- Vous souhaitez normaliser, lors de l'importation, des données dénormalisées provenant d'un tableur.
La forme longue est presque toujours la structure appropriée pour poursuivre le travail en SQL ; le dé-pivotage constitue donc souvent la première étape.
Vérification rapide
Vérifiez que vous connaissez le piège le plus courant du dé-pivotage.
Récapitulatif
Le dé-pivotage transforme les colonnes en lignes :
- Compatible avec plusieurs SGBD : un
SELECTpar colonne, relié avecUNION ALL(jamais avec UNION seul). - Serveur SQL :
UNPIVOTnatif, concis mais supprimant les valeurs NULL. - PostgreSQL :
CROSS JOIN LATERAL (VALUES ...), avec un seul parcours. - Alignez le nombre et les types de colonnes dans toutes les branches ; filtrez les valeurs NULL si la question l'exige.
Questions Fréquemment Posées
La leçon « Transformer des colonnes en lignes » est-elle gratuite ?
Oui — le texte complet de « Transformer des colonnes en lignes » 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 « Transformer des colonnes en lignes » ?
Inverser des tables larges avec UNPIVOT ou UNION ALL 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 3 sur 4.
Combien de temps prend la leçon « Transformer des colonnes en lignes » ?
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
- Créer un tableau croisé avec une agrégation conditionnelle
- Syntaxe PIVOT et des tableaux croisés selon le système
- Transformer des colonnes en lignes
- Tableaux croisés dynamiques avec des colonnes inconnues