読者です 読者をやめる 読者になる 読者になる

第一正規形を破っているテーブルの集計

SQL

例えばアンケート結果で、複数の結果を格納する可能性がある場合に、何を血迷ったかスペース区切りで文字列として格納するようなテーブル設計をやる人がいる。

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