Як я можу отримати функцію SUM в MySQL повернути "0", якщо значення не знайдено?


150

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

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

Якщо жодна з записів у Column_2 не містить тексту "Тест", ця функція повертається NULL, хоча я хотів би, щоб вона повертала 0.

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


можливий дублікат довідки з MySQL SUM ()
JohnFx

Відповіді:


305

Використовуйте, 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
Дякую Бред. Це робить роботу чудово.
Нік

1
Чи НЕ ВИБІР СУМУ (IFNULL (стовпець, 0)) З таблиці ГРУПИ чимось більш правильним? Що робити, якщо у нас є деякі значення IS NULL та деякі реальні значення у "стовпці"?
DarkSide

2
@DarkSide: Абсолютно нічого несподіваного.
Бред Крісті,

@BradChristie так, ви абсолютно праві. SUM працює чудово і з NULL значеннями.
DarkSide

1
Зауважте, що, хоча SUMфункціонує, як бажано, AVGі COUNTможе давати різні результати, коли отримуєте Запрошення NULLвикористовувати, COALESCEяк запропонував @DarkSide, залежно від бажаного результату.
fyrye

65

Використовуйте IFNULLабо COALESCE:

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

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

Різниця між ними полягає в тому, що IFNULLце розширення MySQL, яке займає два аргументи, і COALESCEє стандартною функцією SQL, яка може приймати один або кілька аргументів. Якщо у вас є тільки два аргументи, використання IFNULLтрохи швидше, хоча тут різниця незначна, оскільки вона викликається лише один раз.


3
@Марк, яка різниця в / в IFNULLабо COALESCE?? ви могли б це пояснити ??
пн.

1
PS. Для всіх, хто працює з Postgres, він підтримує лише coalesce.
Сіддхартха

4

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

Запит стосується такого типу MYSQL

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

Ви групуєте за умовою, але не повертаєте її (отримаєте купу невідомих умов)?
Lluis Martinez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.