どうも、はらぐちです。
本来は 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 のレコード数がカウントできました!
ばんざい。