Próbujesz PIVOT
dane. Serwer SQL ma PIVOT
funkcja, która może to dla Ciebie wykonać. Aby wykonać PIVOT
musisz zdecydować, jakiej funkcji agregującej użyć. W moim przykładzie użyłem MAX()
ale możesz użyć SUM()
itp.
Jeśli nie masz funkcji przestawnej, możesz użyć funkcji agregującej z CASE
oświadczenie, aby to zrobić.
Wersja zbiorcza/CASE: Ta wersja wymaga zakodowania wszystkich nazw w kolumnach.
select
max(case when name = 'Engineering' then rating end) Engineering,
max(case when name = 'Financials' then rating end) Financials,
max(case when name = 'Scope' then rating end) Scope,
max(case when name = 'Schedule' then rating end) Schedule,
max(case when name = 'Risks' then rating end) Risks,
max(case when name = 'People' then rating end) People
from yourtable
Zobacz SQL Fiddle z wersją demonstracyjną
Statyczna wersja PIVOT: Zakodujesz na stałe wartości nazw w tym zapytaniu
select *
from
(
select name, rating
from yourtable
) src
pivot
(
max(rating)
for name in ([Engineering], [Financials], [Scope],
[Schedule], [Risks], [People])
) piv
Zobacz SQL Fiddle z wersją demonstracyjną
Powyższe wersje działają świetnie, jeśli masz znaną liczbę kolumn, ale jeśli Twoja nazwa
wartości są nieznane, możesz użyć dynamicznego sql do PIVOT
dane.
Dynamiczna wersja PIVOT:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Name)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + ' from
(
select name, rating
from yourtable
) x
pivot
(
max(rating)
for name in (' + @cols + ')
) p '
execute(@query)
Zobacz SQL Fiddle z wersją demonstracyjną
Wszystkie trzy wersje dadzą ten sam wynik:
| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
| 1 | 3 | 1 | 2 | 3 | 3 |