Wie kann ich die SUM-Funktion in MySQL dazu bringen, '0' zurückzugeben, wenn keine Werte gefunden werden?

150

Angenommen, ich habe eine einfache Funktion in MySQL:

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

Wenn keine Einträge in Column_2 den Text 'Test' enthalten, gibt diese Funktion zurück NULL, während ich möchte, dass sie 0 zurückgibt .

Ich bin mir bewusst, dass hier einige Male eine ähnliche Frage gestellt wurde, aber ich konnte die Antworten nicht an meine Zwecke anpassen, daher wäre ich dankbar, wenn ich Ihnen dabei helfen könnte, diese Frage zu klären.

Nick
quelle
Mögliches Duplikat der Hilfe mit MySQL SUM ()
JohnFx

Antworten:

305

Verwenden Sie COALESCEdiese Option , um dieses Ergebnis zu vermeiden.

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

Um es in Aktion zu sehen, sehen Sie sich bitte diese SQL-Geige an: http://www.sqlfiddle.com/#!2/d1542/3/0


Mehr Informationen:

Gegeben drei Tabellen (eine mit allen Zahlen, eine mit allen Nullen und eine mit einer Mischung):

SQL Fiddle

MySQL 5.5.32 Schema-Setup :

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);

Abfrage 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

Ergebnisse :

| 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 |
Brad Christie
quelle
2
Danke Brad. Das macht den Job gut.
Nick
1
Ist SELECT SUM (IFNULL (Spalte, 0)) FROM table GROUP BY nicht korrekter? Was ist, wenn wir einige IS NULL-Werte und einige reale Werte in "Spalte" haben?
DarkSide
2
@ DarkSide: Absolut nichts Unerwartetes.
Brad Christie
@BradChristie ja du hast absolut recht. SUM funktioniert auch mit NULL-Werten.
DarkSide
1
Bitte beachten Sie, dass während SUMFunktion funktioniert wie gewünscht, AVGund COUNTkann zu unterschiedlichen Ergebnissen beim Empfang NULLAuffordern Sie zu verwenden , COALESCEwie durch @DarkSide, abhängig von Ihrem gewünschten Ergebnis vorgeschlagen.
Fyrye
65

Verwenden Sie IFNULLoder COALESCE:

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

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

Der Unterschied zwischen ihnen besteht darin, dass IFNULLes sich um eine MySQL-Erweiterung handelt, die zwei Argumente akzeptiert, und COALESCEum eine Standard-SQL-Funktion, die ein oder mehrere Argumente annehmen kann. Wenn Sie nur zwei Argumente haben, IFNULList die Verwendung etwas schneller, obwohl hier der Unterschied unbedeutend ist, da er nur einmal aufgerufen wird.

Mark Byers
quelle
3
@ Mark was ist Unterschied s / w IFNULLoder COALESCE?? Könntest du es erklären?
Mo Sean
1
PS. Für alle, die mit Postgres arbeiten, wird nur unterstützt coalesce.
Siddhartha
4

Ich kann nicht genau das bekommen, was Sie fragen, aber wenn Sie eine aggregierte SUMME-Funktion verwenden, die impliziert, dass Sie die Tabelle gruppieren.

Die Abfrage geht für MYSQL wie folgt

Select IFNULL(SUM(COLUMN1),0) as total from mytable group by condition
Sashi Kant
quelle
Sie gruppieren nach Bedingungen, geben sie aber nicht zurück (Sie erhalten eine Reihe unbekannter Bedingungen)?
Lluis Martinez