Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment transformer des lignes en colonnes dans sql server 2005

Il y a des questions similaires ici ,ici répondu dans stackoverflow.

Vous devez utiliser l'opérateur PIVOT dans votre requête pour y parvenir.Voici l'exemple et l'explication sur la façon dont vous pouvez le faire.L'exemple est référencé à partir de ceci la source.

---I assumed your tablename as TESTTABLE---
DECLARE @cols NVARCHAR(2000)
DECLARE @query NVARCHAR(4000)

SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                                '],[' + t.Name
                        FROM    TESTTABLE AS t
                        ORDER BY '],[' + t.Name
                        FOR XML PATH('')
                      ), 1, 2, '') + ']'

SET @query = N'SELECT '+ @cols +' FROM
(SELECT t1.Name , t1.Count FROM TESTTABLE AS t1) p
PIVOT (MAX([Count]) FOR Name IN ( '+ @cols +' ))
AS pvt;'

EXECUTE(@query)

Explication

1.La première partie de la requête

SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                        '],[' + t.Name
                FROM TESTTABLE AS t
                ORDER BY '],[' + t.Name
                FOR XML PATH('')
              ), 1, 2, '') + ']'

vous donne un joli résultat aplati de vos valeurs de colonne Nom dans une seule ligne comme suit

[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]  

Vous pouvez en savoir plus sur STUFF et XML PATH ici et ici .

2.SELECT + @cols + FROM sélectionnera toutes les lignes comme noms de colonnes pour le jeu de résultats final (pvt - étape 3)

c'est-à-dire

Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt] 

3.Cette requête extrait toutes les lignes de données dont nous avons besoin pour créer les résultats du tableau croisé. Le (p) après la requête crée une table temporaire des résultats qui peut ensuite être utilisée pour satisfaire la requête de l'étape 1.

(SELECT t1.Name, t1.Count FROM  TESTTABLE AS t1) p

4.L'expression PIVOT

PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt

fait le résumé réel et place les résultats dans une table temporaire appelée pvt as

Chery | Drew | Morgon | Kath | Kirk | Matt  
-------------------------------------------  
257     1500     13      500    200    76