このタイプのデータ変換はPIVOT
. SQL Server 2005 以降では、このタイプのデータ ローテーションを実行できる関数があります。
日付の値が事前にわかっている場合は、値をハードコーディングできます。
select product,
isnull([12-12-2012], 0) [12-12-2012],
isnull([12-13-2012], 0) [12-13-2012],
isnull([12-14-2012], 0) [12-14-2012]
from
(
select
prod_description as Product,
prod_amount,
convert(char(10), date, 110) date
from cash_bill
) src
pivot
(
sum(prod_amount)
for date in ([12-12-2012], [12-13-2012], [12-14-2012])
) piv
デモで SQL Fiddle を参照してください
実行前に日付が不明な場合、または結果を柔軟にしたい場合は、動的 SQL を使用してデータをピボットできます。動的バージョンは、列として必要な日付のリストを取得し、それらの値で SQL 文字列を作成して、ピボットできるようにします。
DECLARE @cols AS NVARCHAR(MAX),
@colsNull AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(10), date, 110))
from cash_bill
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colsNull = STUFF((SELECT distinct ', IsNull(' + QUOTENAME(convert(char(10), date, 110))+', 0) as '+QUOTENAME(convert(char(10), date, 110))
from cash_bill
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT product,' + @colsNull + ' from
(
select
prod_description as Product,
prod_amount,
convert(char(10), date, 110) date
from cash_bill
) x
pivot
(
sum(prod_amount)
for date in (' + @cols + ')
) p '
execute(@query)
SQL Fiddle with Demoを参照してください。
両方とも結果が得られます。
| PRODUCT | 12-12-2012 | 12-13-2012 | 12-14-2012 |
--------------------------------------------------
| Apple | 35 | 20 | 50 |
| banana | 0 | 10 | 20 |
| Orange | 10 | 12 | 40 |