Dies kann eigentlich ganz einfach mit einem erfolgen PIVOT
Funktion. Da die andere Antwort nicht den zugehörigen Code zur Ausführung zeigt, gibt es hier zwei Möglichkeiten zum PIVOT
die Daten.
Das erste ist mit einem statischen Pivot . Ein statischer Pivot ist, wenn Sie die Daten im Voraus wissen, um sie in Spalten umzuwandeln.
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
Siehe SQL-Geige mit Demo
Die zweite Möglichkeit ist die Verwendung eines Dynamic PIVOT um zur Laufzeit die Werte zu identifizieren, die in Spalten umgewandelt werden sollen.
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)
Siehe SQL-Fiddle mit Demo
Beide werden die gleichen Ergebnisse liefern. Die Dynamik funktioniert hervorragend, wenn Sie die Werte nicht im Voraus kennen, um sie in Spalten umzuwandeln.