Dit kan eigenlijk vrij eenvoudig worden gedaan met een PIVOT
functie. Aangezien het andere antwoord niet de code toont die hoort bij het uitvoeren ervan, zijn hier twee manieren om te PIVOT
de data.
De eerste is met een Statische Pivot . Een statische spil is wanneer u de gegevens van tevoren weet om in kolommen te veranderen.
select *
from
(
select name, id, convert(char(5), dt, 101) dt, jobid, amount
from test
) x
pivot
(
sum(amount)
for dt in ([01/02], [02/02], [03/02], [04/05], [05/05])
)p
order by jobid, name
De tweede manier is door een Dynamic PIVOT . te gebruiken om tijdens runtime de waarden te identificeren die naar kolommen moeten worden omgezet.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(5), dt, 101))
from test
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT name, id, ' + @cols + ', jobid from
(
select name, id, convert(char(5), dt, 101) dt, jobid, amount
from test
) x
pivot
(
sum(amount)
for dt in (' + @cols + ')
) p
order by jobid, name'
execute(@query)
Beide zullen dezelfde resultaten opleveren. De Dynamic werkt geweldig als u de waarden niet van tevoren weet om naar kolommen te converteren.