web-dev-qa-db-fra.com

Comment faire pour que la fonction SOMME dans MySQL renvoie "0" si aucune valeur n'est trouvée?

Disons que j'ai une fonction simple dans MySQL:

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

Si aucune entrée de la colonne 2 ne contient le texte 'Test', cette fonction renvoie NULL, alors que j'aimerais qu'elle renvoie 0.

Je sais qu'une question similaire a été posée à quelques reprises ici, mais je n'ai pas été en mesure d'adapter les réponses à mes objectifs, donc je serais reconnaissant de l'aide pour résoudre ce problème.

130
Nick

Utilisez COALESCE pour éviter ce résultat.

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

Pour le voir en action, voyez ce violon SQL: http://www.sqlfiddle.com/#!2/d1542/3/


Plus d'information:

Étant donné trois tables (une avec tous les nombres, une avec toutes les valeurs nulles et une avec un mélange):

SQL Fiddle

Configuration du schéma 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);

Requête 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

Résultats:

| 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

Utilisez IFNULL ou COALESCE :

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

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

La différence entre eux est que IFNULL est une extension MySQL prenant deux arguments, et COALESCE est une fonction SQL standard pouvant prendre un ou plusieurs arguments. Lorsque vous ne disposez que de deux arguments, utiliser IFNULL est légèrement plus rapide, mais ici la différence est insignifiante car elle n'est appelée qu'une fois.

60
Mark Byers

Vous ne pouvez pas obtenir exactement ce que vous demandez, mais si vous utilisez une fonction d'agrégation SUM, ce qui implique que vous groupez la table.

La requête va pour MYSQL comme ceci

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