Dette kan faktisk gøres ret nemt med en PIVOT
fungere. Da det andet svar ikke viser den kode, der er forbundet med, hvordan det udføres, er der to måder at PIVOT
på dataene.
Først med en Statisk pivot . Et statisk pivot er, når du ved, at dataene på forhånd bliver til kolonner.
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
Den anden måde er ved at bruge en Dynamisk PIVOT for at identificere de værdier, der skal vendes til kolonner under kørsel.
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)
Begge vil give de samme resultater. Dynamikken fungerer godt, når du ikke kender værdierne på forhånd for at konvertere til kolonner.