Подтвердить что ты не робот

Как заставить функцию СУММ в MySQL возвращать '0', если значения не найдены?

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

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

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

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

4b9b3361

Ответ 1

Используйте 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 |

Ответ 2

Используйте IFNULL или COALESCE:

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

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

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

Ответ 3

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

Запрос для MYSQL как это

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