Requête SQL Server UNPIVOT

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. En effet, transposer les colonnes en lignes est utile pour une gestion facilitée. Comme par exemple une gestion générique d’un champ, et non une gestion pour chaque colonne.

Exemple de requête SQL Server UNPIVOT pour transformer les colonnes en lignes

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 deux fonctions de pivot disponibles avec SQL Server : PIVOT et UNPIVOT.

Créer la table SQL Server d’exemple à transformer avec la fonction UNPIVOT

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.

-- 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)
); 

Insérer les lignes d’exemple dans la table source

Ensuite, insérer les données dans la table à pivoter ou transposer, chaque insertion ajoute 12 montant 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

Construire 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;
Cet exemple de requête SQL Server Unpivot  transforme les colonnes en lignes
Cet exemple de requête SQL Server Unpivot transforme les colonnes en lignes

En conclusion, cet article présente un exemple simplifié d’utilisation de la fonction SQL Server UNPIVOT. Ce script T-SQL permet donc de construire une requête Unpivot en sélectionnant les lignes et les colonnes associées.

Pour aller plus loin voilà un article sur la fonction inverse qui est le SQL Server PIVOT :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut