2013年3月8日金曜日

ピボットテーブルが便利すぎる

最近SQL Serverのピボットテーブルを覚えました。
こんな感じで出来ます。

データソースのテーブルとしては、
<uriage_t>
 商品コード | 売上月 | 売上金額
-------------------------------------------
 A          | 1月    |  \1,000
 A          | 2月    |  \2,000
 A          | 3月    |  \3,000
 B          | 1月    |  \4,000
 C          | 3月    |  \5,000

で、ピボットテーブルを作成するSQLは、
SELECT *
FROM uriage_t
PIVOT (
  SUM(売上金額) FOR 売上月 IN ([1月], [2月], [3月])
)

すると、こんな感じに集計されます。
 商品コード | 1月    | 2月    | 3月
-------------------------------------------
 A          | \1,000 | \2,000 | \3,000
 B          | \4,000 | <NULL> | <NULL>
 C          | <NULL> | <NULL> | \5,000

SQLのポイントとしては、次の通り

  • 集計対象のテーブルにくっつけてPIVOT句を書く
  • SUM指定された項目を集計する
  • FORで指定された値が列として出力
  • 集計対象のテーブルの項目の内、SUMとFORで指定された列以外で、GROUP BY が自動的にかかる


一覧表をバーンと出すのに便利なんですが、それでも足りない点がいくつかあります。
  • 集計列は固定で指定しなければいけない(動的SQLを使えば一応できる)
  • 集計の軸は1つのみ(例えば、金額と数両を同時に集計できない)
特に動的SQLは、C#やVBなどのアプリケーション側であれば簡単といえば、簡単なんですが、ストアド内で動的SQLを使おうとすると、一挙にソースの見通しが悪くなるのが辛い。

とはいえ、これが使えると『SQLでデータを取得して、主キーが同じ値の間ループして、該当する列に値を入れていく』とか言うめんどっちいことが要らなくなります。

便利なんで、ついつい使っちゃうんですが、単発のレポートを作るんだったら
Excelのピボットの方が10倍簡単なのが悲しいところですな。

0 件のコメント:

コメントを投稿