
Exemple de requête SQL Server UNPIVOT pour transformer les colonnes en lignes. Avec SQL Server il est possible de Pivoter des colonnes en lignes en une seule requête T-SQL. Pour ce faire, utiliser la fonction UNPIVOT. La syntaxe est particulière car non intuitive, cet exemple de requête transforme les colonnes d’une table de ventes en lignes.
Transposer les colonnes en lignes est utile pour une gestion facilitée. Comme par exemple une gestion générique d’un champs, et non une gestion pour chaque colonne.
Une raison les plus courantes est par exemple la possibilité avec une structure en ligne de rendre le code SQL générique et pouvoir traiter les valeurs indépendamment de la structure de la table. Par exemple, il est possible de calculer des sommes avec des CASE WHEN et non plus en écrivant en dur le nom des colonnes dans les scripts. La documentation officielle explique le fonctionnement des 2 fonctions Pivot et Unpivot.
Exemple de requête SQL Server UNPIVOT pour transformer des colonnes en lignes
1. Créer la table d’exemple à transposer avec SQL Server
Premièrement, on commence par créer la table utilisée pour notre exemple. Elle a une colonne qui contient le type de ventes et une colonne pour chaque mois de l’année.
IF EXISTS ( SELECT 1 FROM sys.objects WHERE object_id = object_id(N'[dbo].[VENTES_TYPES]') AND type in (N'U') ) BEGIN DROP TABLE [dbo].[VENTES_TYPES] END; -- Creation de la table d'exemple VENTES CREATE TABLE [dbo].[VENTES_TYPES] ( [TYPE_VENTE] nvarchar(20), [Janvier] numeric(5), [Février] numeric(5), [Mars] numeric(5), [Avril] numeric(5), [Mai] numeric(5), [Juin] numeric(5), [Juillet] numeric(5), [Août] numeric(5), [Septembre] numeric(5), [Octobre] numeric(5), [Novembre] numeric(5), [Décembre] numeric(5) );
2. Insérer quelques lignes d’exemple dans la table source
Ensuite, insérer les données dans la table à pivoter ou transposer.
INSERT INTO [VENTES_TYPES] VALUES ('Ventes Directes', 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000, 12000); INSERT INTO [VENTES_TYPES] VALUES ('Rabais', 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120); INSERT INTO [VENTES_TYPES] VALUES ('Avoirs', 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60); INSERT INTO [VENTES_TYPES] VALUES ('Retours', 25, 50, 75, 100, 125, 150, 175, 200, 225, 250, 275, 300); SELECT * FROM [dbo].[VENTES_TYPES];

3. Ecriture de la requête SQL avec la fonction Unpivot
Enfin, on peut maintenant écrire la requête UNPIVOT, cet exemple pivote les colonnes en lignes. C’est à dire que pour chaque type de vente et chaque mois en colonnes, on obtient une ligne crée.
Soit 4 types de ventes * 12 mois = 48 lignes transposées.
SELECT Type_Vente, Mois, Montant FROM ( SELECT Type_Vente, Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Août, Septembre, Octobre, Novembre, Décembre FROM [dbo].[VENTES_TYPES] ) VT UNPIVOT ( Montant FOR Mois IN (Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Août, Septembre, Octobre, Novembre, Décembre) ) AS VT_Transposee;

En conclusion, cet article présente comment réutiliser et adapter ce code pour construire une requête Unpivot facilement.
Pour aller plus loin voila un article sur la fonction inverse qui le PIVOT SQL Server:
Soyez le premier à commenter