En realidad, esto se puede hacer bastante fácilmente con un PIVOT
función. Dado que la otra respuesta no muestra el código asociado con cómo realizarlo, aquí hay dos formas de PIVOT
los datos.
El primero es con un pivote estático . Un pivote estático es cuando conoce los datos con anticipación para convertirlos en columnas.
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
Consulte SQL Fiddle con demostración
La segunda forma es usando un PIVOT dinámico para identificar en tiempo de ejecución los valores a convertir en columnas.
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)
Consulte SQL Fiddle con demostración
Ambos producirán los mismos resultados. Dynamic funciona muy bien cuando no conoce los valores con anticipación para convertirlos en columnas.