Това всъщност може да се направи доста лесно с 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 Fiddle с демонстрация
Вторият начин е чрез използване на 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 с демонстрация
И двете ще дадат едни и същи резултати. Dynamic работи чудесно, когато не знаете предварително стойностите, които да конвертирате в колони.