これは実際には を使用して非常に簡単に実行できます。 PIVOT
関数。他の回答には、それを実行する方法に関連付けられたコードが表示されないため、PIVOT
の 2 つの方法を次に示します。 データ。
1 つ目は、静的ピボットです。 .静的ピボットは、列に変換するデータが事前にわかっている場合です。
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 with Demo を参照してください。
2 つ目の方法は、ダイナミック 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 with Demo を参照してください。
どちらも同じ結果になります。ダイナミックは、列に変換する前に値がわからない場合に最適です。