На самом деле это можно сделать довольно легко с помощью функции PIVOT
. Так как другой ответ не показывает код, связанный с тем, как его выполнить, вот два способа PIVOT
данных.
Сначала с Статическим Пивотом . Статический стержень - это когда вы знаете, что данные заблаговременно превращаются в столбцы.
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
См. Скрипка SQL с демоверсией
Второй способ заключается в использовании Dynamic PIVOT для определения во время выполнения значений, которые необходимо преобразовать в столбцы.
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)
См. SQL Fiddle с демонстрацией
Оба будут давать одинаковые результаты. Динамический отлично работает, когда вы не знаете заранее значения для преобразования в столбцы.