• ベストアンサー

複数カラムを跨いだCOUNTができない

以下のようなDB内に顧客id(ユニーク)とhob1,hob2,hob3のようなカラムがありまして、hob1,hob2,hob3には任意で趣味を表す値が入っております。 【hoge_db】 id | hob1 | hob2 | hob3 1 | 1 | 2 | 3 2 | 2 | 3 | NULL 3 | 3 | NULL | NULL 3 | NULL | NULL | NULL ・・・ 【SELECTしたい値】 趣味1:1名 趣味2:2名 趣味3:3名 この各趣味を表す値に対する顧客数を求めたいのですが、3つのカラム全てに対してCOUNTをする方法が分かりません。。 どうかSQLにお強い方、お力を貸して頂けないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

どうして、わざわざこんな扱いにくいテーブルにしているのでしょうかね。。。 select hob,count(hob) from ( select hob1 as hob from hoge_db where hob1 is not null union all select hob2 as hob from hoge_db where hob2 is not null union all select hob3 as hob from hoge_db where hob3 is not null ) as x group by hob order by hob

engbg
質問者

お礼

確かに扱い難いテーブル設計でした・・・ 教えて頂いたunionで結合してからcountする方法で無事値が取り出せました!有難うございました!

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1416)
回答No.1

「1発でやろう」と考えると失敗します。 趣味が3個あるのだから、別々に求める必要があります。 コード1の数を求めるクエリは以下のようになります。 SELECT 1 AS shumi, SUM(CASE WHEN 1 IN (hob1,hob2,hob3) THEN 1 ELSE 0 END) AS cnt FROM hoge_db GROUP BY shumi 同様に2、3を求めて結合します。よって、解は以下の通り。 SELECT 1 AS shumi, SUM(CASE WHEN 1 IN (hob1,hob2,hob3) THEN 1 ELSE 0 END) AS cnt FROM hoge_db GROUP BY shumi UNION SELECT 2 AS shumi, SUM(CASE WHEN 2 IN (hob1,hob2,hob3) THEN 1 ELSE 0 END) AS cnt FROM hoge_db GROUP BY shumi UNION SELECT 3 AS shumi, SUM(CASE WHEN 3 IN (hob1,hob2,hob3) THEN 1 ELSE 0 END) AS cnt FROM hoge_db GROUP BY shumi

engbg
質問者

お礼

ご回答有難うございました!とても参考になりました!

すると、全ての回答が全文表示されます。

関連するQ&A