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