Exemple de Requête SQL Server UNPIVOT

Dans cet article, apprenez à transposer des colonnes en lignes avec une seule requête T-SQL et avec l’opérateur UNPIVOT.

La syntaxe de cette requête est complexe car non intuitive, cet exemple concret transforme les colonnes d’une table de ventes en lignes. Les cas de figures classiques sont une gestion facilitée des données, comme par exemple une gestion générique d’un champ, et non une gestion pour chaque colonne.

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.

1. Créer la table SQL Server à transformer en ligne avec UNPIVOT

Premièrement, on comm, soit douze nce 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, soit 12 colonnes à transposer vers les lignes.

-- Tester et supprimer la table des ventes 
-- si elle est présente dans la base de données
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;

-- Créer la table d'exemple des 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. Requête pour insérer des lignes dans la table source

Ensuite, insérer les données dans la table à transposer, chaque insertion de données SQL ajoute 12 nouveaux montants de ventes. Soit une colonne par mois, avec le type de vente associé.

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];
Insertion des lignes avant utilisation de la requête SQL Server Unpivot
Insertion des lignes avant utilisation de la requête SQL Server Unpivot

3. Exemple de requête SQL Server UNPIVOT pour transposer les données en lignes

Enfin, écrire et exécuter maintenant la requête avec UNPIVOT, pour transformer les colonnes en lignes. C’est à dire que pour chaque type de vente et chaque mois en colonnes, on obtient une nouvelle ligne. 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;
Exemple de requête SQL Server UNPIVOT pour transformer les colonnes en lignes depuis SSMS
Exemple de requête SQL Server UNPIVOT pour transformer les colonnes en lignes depuis SSMS

A propos des requêtes T-SQL UNPIVOT et PIVOT

En guise de conclusion, cet article illustre par un exemple pratique l’utilisation de la requête simplifiée pour exploiter la fonction ou opérateur UNPIVOT de SQL Server. Grâce à ce script T-SQL, il devient possible de décomposer des ensembles de données en séparant les lignes et leurs colonnes correspondantes.

Pour ceux désireux d’approfondir leurs connaissances, voici un lien vers un article complémentaire, dédié cette fois à l’opérateur opposé: le PIVOT de SQL Server. Code T-SQL à ne pas confondre avec la méthode de tri pivot.

Soyez le premier à commenter

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.


*