sql >> Databasteknik >  >> RDS >> Sqlserver

Hur omvandlar jag rader till kolumner i sql server 2005

Det finns liknande frågor här ,här svarade i stackoverflow.

Du måste använda operatorn PIVOT i din fråga för att uppnå detta. Här är exemplet och förklaringen på hur du kan göra det. Exemplet refereras från det här källa.

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

Förklaring

1.Första delen av frågan

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

ger dig ett snyggt tillplattat resultat av dina namnkolumnsvärden i en enda rad enligt följande

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

Du kan lära dig mer om STUFF och XML PATH här och här .

2.SELECT + @cols + FROM kommer att välja alla rader som kolumnnamn för den slutliga resultatuppsättningen (pvt - steg 3)

dvs

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

3. Den här frågan hämtar alla rader med data som vi behöver för att skapa korstabellresultat. (p) efter frågan skapar en tillfällig tabell över resultaten som sedan kan användas för att tillfredsställa frågan för steg 1.

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

4. PIVOT-uttrycket

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

gör själva sammanfattningen och lägger in resultaten i en tillfällig tabell som heter pvt as

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


  1. Använda DateTime i en SqlParameter för lagrad procedur, formatfel

  2. Distinkt vs Group By

  3. Kan jag använda VARCHAR som PRIMÄRNYCKEL?

  4. Kontrollera kodantändningsfrågefel istället för att visa dem för användaren