カラムの値ごとにレコード数を集計したいという要件はよくあるかと思います。
例えば、以下のようなテーブルでstatus列の値ごとにレコードの数をCOUNTしたい場合などです。
このような場合には以下の二つの方法のいずれかがシンプルです。
UNIONパターン
ステータスごとにクエリを分割し、最後にその結果をUNIONします。
(select count(*), 'status_0' as status from test_count t where t.status = 0) union (select count(*), 'status_1' as status from test_count t where t.status = 1);
シンプルで分かりやすいのが長所です。
欠点としては、
・ステータスが増えるとクエリが上長になる。
・結果が複数行になる。
・どのステータスなのかを示す列を定義する必要がある。
といったところになります。
ステータスの取り得る値がそれほど多くない場合は、有効な手段です。
SUM + CASEパターン
SUMとCASEを併用するパターンです。
select sum(case t.status when 0 then 1 else 0 end) as status_0, sum(case t.status when 1 then 1 else 0 end) as status_1 from test_count t;
UNIONパターンと比べ、
・記述がすっきりする
・結果が1行にまとまる
といったメリットがあります。
一方、条件式を複雑にするとややこしくなります。
今回はstatusでしか判定していませんが、それに加えreg_dateなども見るなど複合条件になった時はクエリが見にくくなります。
条件式が複雑になる場合は、UNION式の方がわかりやすく書けるでしょう。