Są podobne pytania tutaj ,tutaj odpowiedział w stackoverflow.
Musisz użyć operatora PIVOT w zapytaniu, aby to osiągnąć. Oto przykład i wyjaśnienie, jak możesz to zrobić. Odwołanie do przykładu pochodzi z to źródło.
---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)
Wyjaśnienie
1. Pierwsza część zapytania
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t.Name
FROM TESTTABLE AS t
ORDER BY '],[' + t.Name
FOR XML PATH('')
), 1, 2, '') + ']'
daje ładny spłaszczony wynik wartości kolumny Nazwa w jednym wierszu, jak następuje
[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]
Więcej informacji o STUFF i XML PATH znajdziesz tutaj i tutaj .
2.SELECT + @cols + FROM
wybierze wszystkie wiersze jako nazwy kolumn dla końcowego zestawu wyników (pvt - krok 3)
czyli
Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt]
3. To zapytanie pobiera wszystkie wiersze danych, których potrzebujemy, aby utworzyć wyniki z tabeli krzyżowej. (p) po zapytaniu tworzy tymczasową tabelę wyników, której można następnie użyć do spełnienia zapytania z kroku 1.
(SELECT t1.Name, t1.Count FROM TESTTABLE AS t1) p
4.Wyrażenie PIVOT
PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt
dokonuje faktycznego podsumowania i umieszcza wyniki w tymczasowej tabeli o nazwie pvt jako
Chery | Drew | Morgon | Kath | Kirk | Matt
-------------------------------------------
257 1500 13 500 200 76