集計地獄.

うーん,ENUM型がほしいなあ.

次みたいなDBのテーブルがある

顧客テーブル
顧客コード,希望商品コード
A,01
B,03
C,04
D,01
(一意キーは顧客コード.各顧客コードに対して希望商品コードはひとつ)
アンケートテーブル
顧客コード,希望商品コード
A,01
A,05
B,01
B,04
B,05
D,02
D,04
(アンケートではひとりが複数を回答することがある)

 マーケティングに使うらしく,この両方のテーブルから,商品コードが属している商品ジャンル別に集計してほしいと要求されることが多い.たとえば次のような集計を要求される.

商品ジャンル,人数
0001,3
0002,6

これは「顧客テーブル」と「アンケートテーブル」をUNION ALLで結合したテーブルに対してGROUP BYすればいいのだけれど,問題は

  1. 上記の例だと2つだけでいいのだが,実際は4つのテーブルを連結する必要がある
  2. 各テーブルの件数が多すぎる(70万件とか)

があって,SQL投げてもいっこうに返ってこない.
 しかたないので,速度を優先してアンケートテーブルを次のように持って,SQL内にカラムをべた書きしている.うーん汚い.

アンケートテーブル2
ID,商品01,商品02,商品03,商品04,商品05
A,1,0,0,0,1
B,0,0,0,1,1
D,0,1,0,1,0

 プロシージャ書いてテンポラリに展開したらそれなりに速くできるんかなあ.