Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso trasformare le righe in colonne in SQL Server 2005

Ci sono domande simili qui ,qui ha risposto in stackoverflow.

È necessario utilizzare l'operatore PIVOT nella tua query per ottenere questo. Ecco l'esempio e la spiegazione su come farlo. L'esempio è citato da questo fonte.

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

Spiegazione

1.La prima parte della query

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

ti dà un bel risultato appiattito dei valori della colonna Nome in una singola riga come segue

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

Puoi saperne di più su STUFF e XML PATH qui e qui .

2.SELECT + @cols + FROM selezionerà tutte le righe come nomi di colonna per il set di risultati finale (pvt - passaggio 3)

cioè

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

3.Questa query estrae tutte le righe di dati di cui abbiamo bisogno per creare i risultati a campi incrociati. Il (p) dopo la query sta creando una tabella temporanea dei risultati che può quindi essere utilizzata per soddisfare la query per il passaggio 1.

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

4.L'espressione PIVOT

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

esegue il riepilogo effettivo e inserisce i risultati in una tabella temporanea denominata pvt as

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