1

特定の期間の Item Wise Sales のレポートを抽出するために、以下のような select ステートメントを実行しています

SELECT prod_description as Product,
    sum(prod_amount) as Total_sales,
    date 
from cash_bill  
group by date,prod_description

以下のような出力を垂直形式で取得しています。

アイテム名 発売日
アップル 35 12-12-2012
オレンジ 10 2012 年 12 月 12 日
アップル 20 13-12-2012
オレンジ 12 13-12-2012
バナナ 10 13-12-2012
アップル 50 14-12-2012
オレンジ40 2012年12月14日
バナナ 20 14-12-2012

しかし、私は以下のような出力を次のような表形式で表示したい:

項目名 2012 年 12 月 12 日 2012 年 12 月 13 日 2012 年 12 月 14 日
りんご 35 20 50
オレンジ 10 12 40
バナナ 0 10 20

どうすればこれを達成できますか?

4

1 に答える 1

0

このタイプのデータ変換は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 |
于 2013-02-05T14:52:10.730 に答える