SQL Server では、PIVOT
列の行からデータを変換する関数を実装できます。
select productname,
[2011.01],
[2011.02]
from
(
select ProductName,
(convert(varchar(7), CreatedOn, 102)) as 'month'
from Incidentbase
where createdon >= '2011-01-01'
) src
pivot
(
count(month)
for month in ([2011.01], [2011.02])
) piv
デモで SQL Fiddle を参照してください
列に変換する日付の数が不明な場合は、動的 SQL を使用できます。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME((convert(varchar(7), CreatedOn, 102)))
from Incidentbase
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ProductName,' + @cols + ' from
(
select ProductName,
(convert(varchar(7), CreatedOn, 102)) as month
from Incidentbase
where createdon >= ''2011-01-01''
) x
pivot
(
count(month)
for month in (' + @cols + ')
) p '
execute(@query)
SQL Fiddle with Demoを参照してください。
動的クエリに日付を渡したい場合は、少し異なるバージョンのコードを使用します。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@startdate datetime
set @startdate = '2011-01-01'
select @cols = STUFF((SELECT distinct ',' + QUOTENAME((convert(varchar(7), CreatedOn, 102)))
from Incidentbase
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ProductName,' + @cols + ' from
(
select ProductName,
(convert(varchar(7), CreatedOn, 102)) as month
from Incidentbase
where createdon >= '+convert(varchar(10), @startdate, 120)+'
) x
pivot
(
count(month)
for month in (' + @cols + ')
) p '
execute(@query)
デモで SQL Fiddle を参照してください