Pokoušíte se PIVOT
data. SQL server má PIVOT
funkce, která to může provést za vás. Pro provedení PIVOT
musíte se rozhodnout, jakou agregační funkci použít. V mém příkladu jsem použil MAX()
ale můžete použít SUM()
, atd.
Pokud nemáte kontingenční funkci, můžete použít agregační funkci s CASE
prohlášení k tomu.
Agregovaná/CASE verze: Tato verze vyžaduje, abyste pevně zakódovali všechny názvy do sloupců.
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
Statická verze PIVOT: Do tohoto dotazu natvrdo zakódujete hodnoty jmen
select *
from
(
select name, rating
from yourtable
) src
pivot
(
max(rating)
for name in ([Engineering], [Financials], [Scope],
[Schedule], [Risks], [People])
) piv
Výše uvedené verze fungují skvěle, pokud máte známý počet sloupců, ale pokud máte name
hodnoty neznámé, pak můžete použít dynamické sql k PIVOT
data.
Verze dynamického 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)
Všechny tři verze poskytnou stejný výsledek:
| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
| 1 | 3 | 1 | 2 | 3 | 3 |