[SQL]SUMの結果がNULLになってしまう時の対処法

SQLクエリでSUMを使っているのですが計算するデータがなかった場合にNULLが結果として返ってくることがあります。
例え計算するデータがなくても、結果は「0」として返ってきてほしいですよね?
テーブル作りからやり直し!とか言われても、引き継いだのってどうしようもないじゃん!

COALESCE関数を使用する

COALESCE関数は、引数を順番に評価しNULLだった場合は次の評価を返してくれる関数です。
引数は、何個でも設定する事ができます。
まずは、テーブル構成と一般的なSQLから…

# exampleテーブル

 id | name | price
----+------+-------
  1 | A    |   100
----+------+-------
  2 | B    |   150
----+------+-------
  3 | C    |  NULL
----+------+-------
  4 | D    |  NULL
----+------+-------
  5 | E    |   300
----+------+-------
  6 | NULL |  NULL
----+------+-------
# 普通に書く
SELECT SUM(price) FROM example;

# 結果:550

使っているDBMSによっては結果がNULLになるみたいです。
MySQLでは、数字の入っている箇所のみを計算して結果が正しく返ってきました。

# NULLだけ取得する
SELECT SUM(price) FROM example WHERE price is NULL;

# 結果:NULL

NULLだけを取得すると結果には0ではなくNULLが入ってきました。
SUMしているのであればやはりどんな状況であろうと「0」が欲しい!と思うのが普通ですよね。

NULLの値を0で取得する

そこで出てくるのが「COALESCE関数」です。
これはどういう風に使うかと言うと…まずは見てください。

# NULLを0で取得する
SELECT COALESCE(SUM(price), 0) FROM example WHERE price is NULL;

# 結果:0

SUM関数をCOALESCE関数で閉じ込めてあげます。
次は、引数として0を設定してあげるだけです。
もちろん、0以外にも10などの違う数字でも大丈夫です。

ちょっと応用して、NULLの値を指定して計算させる

データとしてはNULLとして設定されているが、このNULLは100として固定して計算させたい!という場合のやり方です。
応用も何もないのですが…

# NULLだったら文字列で取得する
SELECT SUM(COALESCE(price, 100)) FROM example;

# 結果:850

NULLだったところを、100に設定して全てのpriceを計算してみました。
レコードを変更するのはちょっと…という場合に使えそうなテクニックですね!

引数は何個でも設定することが可能

冒頭で書きましたが、COALESCE関数は引数を何個も設定できます。
どういう事?と思いますが、左がダメだったら次は右、それがダメだったら右…というように処理をしてくれます。
2つのカラムを見てどちらもNULLだったら3つ目の引数を返すというように使えます。

# COALESCE関数の引数を複数設定
SELECT COALESCE(price, name, 9999) FROM example;

# 結果
 COALESCE(price, name, 9999)
-----------------------------
 100
 150
 C
 D
 300
 9999

結果は、6番目のデータに「9999」という値が設定されました。
priceカラムを評価してNULLだったらnameカラムを評価してNULLだったら9999を返すという事になります。

NULLに悩まされていた人は是非使ってみてください!

スポンサーリンク
  • このエントリーをはてなブックマークに追加
スポンサーリンク

コメント

  1. […] [SQL]SUMの結果がNULLになってしまう時の対処法 | イザ!WEB開発者の惚気 […]

Kei178's blog | SQL - 計算する時はNULLに注意! - Kei178's blog へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください