BBH
-Biz Branding Hub-
投稿日 : 
2020/07/22
更新日 : 
2020/07/22

カラムの値ごとにレコード数を集計する方法

カラムの値ごとにレコード数を集計したいという要件はよくあるかと思います。
例えば、以下のようなテーブルでstatus列の値ごとにレコードの数をCOUNTしたい場合などです。

このような場合には以下の二つの方法のいずれかがシンプルです。

UNIONパターン

ステータスごとにクエリを分割し、最後にその結果を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を併用するパターンです。

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式の方がわかりやすく書けるでしょう。

Profile

管理人プロフィール

都内でITエンジニアをやってます。
変遷:中規模SES→独立系SIer→Webサービス内製開発
使用技術はその時々でバラバラですが、C#、AWSが長いです。
どちらかと言うとバックエンドより開発が多かったです。
顧客との折衝や要件定義、マネジメント(10名弱程度)の経験あり。
最近はJava+SpringBootがメイン。

Recommend