Има подобни въпроси тук ,тук отговори в stackoverflow.
Трябва да използвате оператора PIVOT във вашата заявка, за да постигнете това. Ето примера и обяснението как можете да направите това. Примерът е препратен от това източник.
---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)
Обяснение
1.Първата част на заявката
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t.Name
FROM TESTTABLE AS t
ORDER BY '],[' + t.Name
FOR XML PATH('')
), 1, 2, '') + ']'
ви дава приятен изравнен резултат от стойностите на колоната ви Име в един ред, както следва
[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]
Можете да научите повече за STUFF и XML PATH тук и тук .
2.SELECT + @cols + FROM
ще избере всички редове като имена на колони за крайния набор от резултати (pvt - стъпка 3)
т.е.
Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt]
3. Тази заявка изтегля всички редове с данни, които са ни необходими, за да създадем резултатите от кръстосани раздели. (p) след заявката създава временна таблица с резултатите, които след това могат да се използват за удовлетворяване на заявката за стъпка 1.
(SELECT t1.Name, t1.Count FROM TESTTABLE AS t1) p
4. Изразът PIVOT
PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt
прави действителното обобщение и поставя резултатите във временна таблица, наречена pvt като
Chery | Drew | Morgon | Kath | Kirk | Matt
-------------------------------------------
257 1500 13 500 200 76