SQLのちょっとしたテクニックを紹介していきます。
今回は、『異なる条件の集計の仕方』です。
集計というと「GROUP BY」を使いますが、使っているうちに「集計結果の列をもっと増やして確認したい」なんて言うケースが出てきます。
言葉だとうまく伝わらないと思いますので、具体的なケースを紹介して説明していきます。
集計したいもの
以下、左図にあるような、部門テーブル(TB_DEP)があるとします。
このテーブルから、SQLを使って「部門ごと、男女別」の人数表を集計します。
普通に集計(おすすめしないやり方)
容易に思いつくのは、次のような方法です。
①部門ごとの「男」の人数を集計
②部門ごとの「女」の人数を集計
③①と②をジョイン
上記の方法でSQLを書くと以下になります。
SELECT
man.dep
, man.cnt AS "男"
, woman.cnt AS "女"
FROM
( SELECT dep, cnt FROM tb_dep WHERE sex = '1' ) as man
INNER JOIN
( SELECT dep, cnt FROM tb_dep WHERE sex = '2' ) as woman
ON man.dep = woman.dep
SQLのコーディング量が多く、可読性が落ちます。
CASE式で集計(おすすめのやり方)
CASE式を使うと、SQLのコーディング量を減らせます。
SELECT
dep
, SUM( CASE WHEN sex = '1' THEN cnt ELSE 0 END ) as "男"
, SUM( CASE WHEN sex = '2' THEN cnt ELSE 0 END ) as "女"
FROM
tb_dep
GROUP BY
dep
【解説】
性別が1(=男)と2(=女)をそれぞれ分けて合計することがポイントになります。異なる条件なので、WHERE句で分岐させるのが真っ先に思いつきやすいですが、CASEで分岐させて集計できることを覚えておくと便利です!
以上、『異なる条件の集計の仕方』でした。
コメント