Transformer des données en colonnes en lignes séparées par une virgule

Publié le 05 décembre 2008 par Olivier Moreau

Un script SQL bien utile trouvé sur le site de "Have you any wool?" qui permet de transformer en lignes des données se trouvant dans une colonne.

ici le script :

Declare @CDTable TABLE  
(  
   [Base]   varchar(10) NOT NULL,  
   [Region]  varchar(10) NOT NULL,  
   [Centre]  varchar(10) NOT NULL,
   [Secteur] varchar(5) NOT NULL,
   [Client]  varchar(10) NOT NULL
)  
 
INSERT @CDTable  
  SELECT 'BASE01','IDFrance' ,'Paris'   ,'75010','Client 1' Union ALL  
  SELECT 'BASE01','IDFrance' ,'Versailles','78000','Client 2' Union ALL
  SELECT 'BASE02','OUEST'   ,'Rennes'   ,'35000','Client 3' Union ALL
  SELECT 'BASE02','OUEST'   ,'Brest'   ,'29200','Client 4' Union ALL
  SELECT 'BASE03','SUD-OUEST','Pauilhac'  ,'32500','Client 5' Union ALL
  SELECT 'BASE03','SUD-OUEST','Toulouse'  ,'31000','Client 6' Union ALL
  SELECT 'BASE03','SUD-OUEST','Bordeaux'  ,'33000','Client 7'
 
SELECT DISTINCT  
   [Region],  
   [Base],  
   (Stuff((SELECT ',' + Centre  FROM @CDTable T2 WHERE T2.Base = T1.Base AND T2.Region = T2.Region FOR XML PATH('')),1,1,'')) AS Centre,  
 (Stuff((SELECT ',' + Secteur FROM @CDTable T2 WHERE T2.Base = T1.Base AND T2.Region = T2.Region FOR XML PATH('')),1,1,'')) AS Secteur,  
 (Stuff((SELECT ',' + Client  FROM @CDTable T2 WHERE T2.Base = T1.Base AND T2.Region = T2.Region FOR XML PATH('')),1,1,'')) AS Client
FROM @CDTable T1  
ORDER BY [Base] 

On passe de données dans ce format

Base Region Centre Secteur Client

BASE01 IDFrance Paris 75010 Client 1

BASE01 IDFrance Versailles 78000 Client 2

BASE02 OUEST Rennes 35000 Client 3

BASE02 OUEST Brest 29200 Client 4

BASE03 SUD-OUEST Pauilhac 32500 Client 5

BASE03 SUD-OUEST Toulouse 31000 Client 6

BASE03 SUD-OUEST Bordeaux 33000 Client 7

à ce format !!

Base Region Centre Secteur Client

BASE01 IDFrance Paris,Versailles 75010,78000 Client 1,Client 2

BASE02 OUEST Rennes,Brest 35000,29200 Client 3,Client 4

BASE03 SUD-OUEST Pauilhac,Toulouse,Bordeaux 32500,31000,33000 Client 5,Client 6,Client 7

la fonction Stuff permet d'insérer une chaîne dans une autre chaîne. Elle efface d'abord le nombre de caractères spécifié dans la première chaîne à partir de la position de début. Ensuite, elle insère la seconde chaîne dans la première à partir de la position de début.