Requête SQL Server UNPIVOT pour transposer les colonnes d’une table en lignes




Avec SQL Server il est possible de Pivoter des colonnes en lignes, pour ce faire, il fait utiliser le mot clef UNPIVOT. La syntaxe est particulière car non intuitive, cet exemple de requête transforme les colonnes en lignes d’une table SQL Server. Il est en effet utile de transposer les colonnes en lignes pour une gestion facilitée, comme par exemple une gestion générique d’un champs, et non une gestion pour chaque colonne.

 

Transformer des colonnes d’une table en lignes avec une requête UNPIVOT

 

Création de la table d’exemple à transposer avec SQL Server

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

 

Insertion de quelques lignes à transposer dans la table

On insère ensuite les données dans notre 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];

 

Ecriture de la requête SQL avec le mot clef UNPIVOT

On peut maintenant écrire la requête UNPIVOT, dans cet exemple on fait passer 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;

 

 

 

 

 

 

 




Soyez le premier à commenter

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.


*