web-dev-qa-db-ja.com

値が見つからない場合、MySQLでSUM関数を取得して '0'を返すにはどうすればよいですか?

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

SELECT SUM(Column 1) from Table WHERE Column 2='Test'

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

ここでは何度か同じような質問がされていることを知っていますが、答えを自分の目的に適合させることができなかったので、これを整理するための助けに感謝します。

130
Nick

COALESCE を使用して、その結果を回避します。

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

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


詳しくは:

3つのテーブルがある場合(1つはすべて数字、1つはすべてヌル、もう1つは混合):

SQL Fiddle

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 |
276
Brad Christie

IFNULL または COALESCE を使用します。

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

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

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

60
Mark Byers

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

クエリはMYSQLに次のようになります

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