[SQL] 異なる条件の集計の仕方(CASE式)

スポンサーリンク
SQL

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で分岐させて集計できることを覚えておくと便利です!

以上、『異なる条件の集計の仕方』でした。

コメント

タイトルとURLをコピーしました