SQL Server を使用しているため、データを行から列にピボットする方法がいくつかあります。
値が制限されている場合、または既知の数の値がある場合は、静的ピボットを使用して値をハードコーディングできます。
select name, [Dec_12], [Jan_13], [Feb_13]
from
(
select name,
left(datename(month, dateadd(month, month, 0) -1), 3) +'_'+right(cast(year as varchar(4)), 2) MY,
[count]
from yourtable
) src
pivot
(
sum(count)
for my in ([Dec_12], [Jan_13], [Feb_13])
) piv;
SQL Fiddle with Demoを参照してください。
ここで、値の数が不明な場合は、動的 SQL を実装して結果を生成する必要があります。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(my)
from
(
select left(datename(month, dateadd(month, month, 0) -1), 3) +'_'+right(cast(year as varchar(4)), 2) my,
CAST(
CAST(year AS VARCHAR(4)) +
RIGHT('0' + CAST(month AS VARCHAR(2)), 2) +
'01'
AS DATETIME) fulldate
from yourtable
) t
group by my, fulldate
order by fulldate
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT name, ' + @cols + '
from
(
select name,
left(datename(month, dateadd(month, month, 0) -1), 3) +''_''+right(cast(year as varchar(4)), 2) MY,
[count]
from yourtable
) x
pivot
(
sum(count)
for my in (' + @cols + ')
) p '
execute(@query)
SQL Fiddle with Demoを参照してください。
これと静的バージョンのこの違いは、不明な数の日付が必要な場合、または新しい日付が利用可能になったときにこれを自動的に更新する場合、コードを変更せずに新しいデータを返すことです。
両方のクエリの結果は次のとおりです。
| NAME | DEC_12 | JAN_13 | FEB_13 |
-----------------------------------
| xxx | 24 | 42 | 23 |
| yyy | 34 | 12 | 54 |