U probeert PIVOT
de data. SQL-server heeft een PIVOT
functie die dit voor u kan uitvoeren. De PIVOT
uitvoeren u moet beslissen welke aggregatiefunctie u wilt gebruiken. In mijn voorbeeld gebruikte ik MAX()
maar je kunt SUM()
. gebruiken , enz.
Als u geen spilfunctie hebt, kunt u een aggregatiefunctie gebruiken met een CASE
verklaring om dit te doen.
Geaggregeerde/CASE-versie: Deze versie vereist dat u alle namen hard codeert in de kolommen.
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
Statische PIVOT-versie: U zult de waarden van de namen hard coderen in deze query
select *
from
(
select name, rating
from yourtable
) src
pivot
(
max(rating)
for name in ([Engineering], [Financials], [Scope],
[Schedule], [Risks], [People])
) piv
De bovenstaande versies werken prima als u een bekend aantal kolommen heeft, maar als uw name
waarden zijn onbekend, dan kunt u dynamische sql gebruiken om PIVOT
de gegevens.
Dynamische PIVOT-versie:
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)
Alle drie de versies zullen hetzelfde resultaat opleveren:
| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
| 1 | 3 | 1 | 2 | 3 | 3 |