hero_picture
Cover Image for 【COALESCE関数で解決!】MySQLで値が NULL のデータを集計(count)したい

【COALESCE関数で解決!】MySQLで値が NULL のデータを集計(count)したい

どうも、はらぐちです。

本来は NULL を撲滅すべきなのですが、
MySQLで値が NULL のデータを、
どうしても集計(count)してみたくなったもので……

というわけで、やってみました!

やりたかった事

以下のようなテーブルとデータがあるとして

1テーブル data
2+-------+
3| value |
4+-------+
5| aaa   |
6| aaa   |
7| aaa   |
8| aaa   |
9| bbb   |
10| bbb   |
11| NULL  |
12| NULL  |
13| NULL  |
14+-------+

それぞれの値の数を集計するために、以下のSQLを実行したら

1SELECT value,count(value) FROM data GROUP BY value;

結果

1+-----------+--------------+
2| value     | count(value) |
3+-----------+--------------+
4| NULL      |            0 |
5| aaa       |            4 |
6| bbb       |            2 |
7+-----------+--------------+

NULLのカウントは 0 になって集計できない……
これをなんとか集計したい!

解決策

COALESCE関数を使う

引数を順番に評価し、NULL と評価されない最初の式の現在の値を返し、
すべての引数がNULLの場合はNULLを返すという関数です。

例えば以下の場合

1COAESCE(value,value2,'abc')

valueカラムが null の場合は value2 を返す。
value2も null の場合は 
‘abc’ という値を返す。

という動きになります。

これを踏まえて、はじめのSQLを以下のように編集

1SELECT value,count(COALESCE(value,'')) FROM data GROUP BY value;

結果

1+-----------+---------------------------+
2| value     | count(COALESCE(value,'')) |
3+-----------+---------------------------+
4| NULL      |                         3 |
5| aaa       |                         4 |
6| bbb       |                         2 |
7+-----------+---------------------------+

値が NULL のレコード数がカウントできました!
ばんざい。