Detta kan faktiskt göras ganska enkelt med en PIVOT
fungera. Eftersom det andra svaret inte visar koden som är kopplad till hur man utför det, finns det två sätt att PIVOT
uppgifterna.
Det första är med en Statisk pivot . En statisk pivot är när du vet att data i förväg förvandlas till kolumner.
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
Det andra sättet är att använda en Dynamisk PIVOT för att identifiera de värden som ska vändas till kolumner under körning.
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)
Båda ger samma resultat. Dynamiken fungerar utmärkt när du inte känner till värdena i förväg för att konvertera till kolumner.