Как получить функцию SUM в MySQL, чтобы она возвращала '0', если значения не найдены? - PullRequest
129 голосов
/ 29 сентября 2011

Скажите, у меня есть простая функция в MySQL:

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

Если в столбце 2 нет записей, содержащих текст «Test», то эта функция возвращает NULL, а я хочу, чтобы она возвращала 0.

Я знаю, что подобный вопрос задавался здесь несколько раз, но я не смог адаптировать ответы к своим целям, поэтому я был бы благодарен за некоторую помощь, чтобы разобраться в этом.

Ответы [ 3 ]

269 голосов
/ 29 сентября 2011

Используйте COALESCE, чтобы избежать этого результата.

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

Чтобы увидеть это в действии, пожалуйста, посмотрите эту скрипту sql: http://www.sqlfiddle.com/#!2/d1542/3/0


Дополнительная информация:

Имеются три таблицы (одна со всеми числами, одна со всеми нулями и одна со смесью):

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 |
58 голосов
/ 29 сентября 2011

Использование IFNULL или COALESCE:

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

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

Разница между ними заключается в том, что IFNULL - это расширение MySQL, которое принимает два аргумента, а COALESCE - это стандартная функция SQL, которая может принимать один или несколько аргументов. Когда у вас есть только два аргумента, использование IFNULL немного быстрее, хотя здесь разница незначительна, поскольку он вызывается только один раз.

3 голосов
/ 30 сентября 2011

Не могу получить именно то, что вы просите, но если вы используете агрегатную функцию SUM, которая подразумевает, что вы группируете таблицу.

Запрос выполняется для MYSQL, как этот

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