値が見つからない場合、MySQLのSUM関数で「0」を返すにはどうすればよいですか?


150

MySQLに単純な関数があるとします。

SELECT SUM(Column_1)
FROM Table
WHERE Column_2 = 'Test'

Column_2 のエントリにテキスト「Test」が含まれていない場合、この関数はを返しますがNULL、0を返します。

同様の質問がここで何度か行われたことは承知していますが、自分の目的に回答を適応させることができなかったので、これを分類するための助けに感謝します。


回答:


305

COALESCEその結果を回避するために使用します。

SELECT COALESCE(SUM(column),0)
FROM   table
WHERE  ...

実際の動作を確認するには、次のSQLフィドルを参照してください。http://www.sqlfiddle.com/#!2 / d1542 / 3/0


詳しくは:

3つのテーブルが与えられた場合(1つはすべて数値、1つはすべてnull、1つは混合):

SQLフィドル

MySQL 5.5.32スキーマのセットアップ

CREATE TABLE foo
(
  id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  val   INT
);

INSERT INTO foo (val) VALUES
(null),(1),(null),(2),(null),(3),(null),(4),(null),(5),(null),(6),(null);

CREATE TABLE bar
(
  id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  val   INT
);

INSERT INTO bar (val) VALUES
(1),(2),(3),(4),(5),(6);

CREATE TABLE baz
(
  id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  val   INT
);

INSERT INTO baz (val) VALUES
(null),(null),(null),(null),(null),(null);

クエリ1

SELECT  'foo'                   as table_name,
        'mixed null/non-null'   as description,
        21                      as expected_sum,
        COALESCE(SUM(val), 0)   as actual_sum
FROM    foo
UNION ALL

SELECT  'bar'                   as table_name,
        'all non-null'          as description,
        21                      as expected_sum,
        COALESCE(SUM(val), 0)   as actual_sum
FROM    bar
UNION ALL

SELECT  'baz'                   as table_name,
        'all null'              as description,
        0                       as expected_sum,
        COALESCE(SUM(val), 0)   as actual_sum
FROM    baz

結果

| TABLE_NAME |         DESCRIPTION | EXPECTED_SUM | ACTUAL_SUM |
|------------|---------------------|--------------|------------|
|        foo | mixed null/non-null |           21 |         21 |
|        bar |        all non-null |           21 |         21 |
|        baz |            all null |            0 |          0 |

2
ブラッド、ありがとう。それはうまく仕事をします。
ニック、

1
SELECT SUM(IFNULL(column、0))FROMテーブルGROUP BYではないですか?「列」にIS NULL値と実際の値がある場合はどうなりますか?
DarkSide 2013


@BradChristieはい、あなたは絶対に正しいです。SUMはNULL値でも正常に機能します。
DarkSide 2014年

1
一方であることに注意してくださいSUM機能を行い、必要に応じて、AVGCOUNTすることができます異なる結果を生成受信したときにNULL使用するプロンプトCOALESCEご希望の結果に応じて、@DarkSideによって示唆されているように。
fyrye

65

IFNULLまたはを使用COALESCE

SELECT IFNULL(SUM(Column1), 0) AS total FROM...

SELECT COALESCE(SUM(Column1), 0) AS total FROM...

それらの違いIFNULLは、2つの引数を取るMySQL拡張でCOALESCEあり、1つ以上の引数を取ることができる標準SQL関数であることです。引数が2つしかない場合IFNULLは、使用する方がわずかに速くなりますが、1回しか呼び出されないため、ここでは違いはわずかです。


3
@マーク差Bは何のw / IFNULL又はCOALESCE?説明していただけますか?
mo sean 2014年

1
PS。Postgresで作業する人は、のみをサポートしますcoalesce
シッダールタ

4

あなたが求めているものを正確に取得することはできませんが、テーブルをグループ化していることを意味する集約SUM関数を使用している場合。

クエリはこのようにMYSQLに行きます

Select IFNULL(SUM(COLUMN1),0) as total from mytable group by condition

条件でグループ化しても返さない(不明な条件がたくさん表示されます)?
Lluis Martinez
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.