第一正規形を破っているテーブルの集計
例えばアンケート結果で、複数の結果を格納する可能性がある場合に、何を血迷ったかスペース区切りで文字列として格納するようなテーブル設計をやる人がいる。
cid*1 | enq_id | answers |
---|---|---|
1 | 1 | 1 3 |
1 | 2 | |
2 | 1 | 1 2 3 |
2 | 2 | 10 |
・・・ | ・・・ | ・・・ |
こんな感じ。
今日(昨日か)ちょうど、こんなテーブルでアンケート項目一つ一つの合計を求めることが出来ないか相談されたので、こんなSQLを書いた。
SELECT enq_id , sum(CASE WHEN answers = '' THEN 1 ELSE 0 END) AS none , sum(CASE WHEN answers = '1' OR answers LIKE '1 %' THEN 1 ELSE 0 END) AS ans_1 , sum(CASE WHEN answers LIKE '%2%' THEN 1 ELSE 0 END) AS ans_2 , sum(CASE WHEN answers LIKE '%3%' THEN 1 ELSE 0 END) AS ans_3 , sum(CASE WHEN answers LIKE '%4%' THEN 1 ELSE 0 END) AS ans_4 , sum(CASE WHEN answers LIKE '%5%' THEN 1 ELSE 0 END) AS ans_5 , sum(CASE WHEN answers LIKE '%6%' THEN 1 ELSE 0 END) AS ans_6 , sum(CASE WHEN answers LIKE '%7%' THEN 1 ELSE 0 END) AS ans_7 , sum(CASE WHEN answers LIKE '%8%' THEN 1 ELSE 0 END) AS ans_8 , sum(CASE WHEN answers LIKE '%9%' THEN 1 ELSE 0 END) AS ans_9 , sum(CASE WHEN answers LIKE '%10' THEN 1 ELSE 0 END) AS ans_10 FROM EnqueteAnswers GROUP BY enq_id ORDER BY enq_id
*1:customer_id