188 votes

Comment faire pour que la fonction SUM de 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 dans Column_ 2 contiennent le texte "Test", cette fonction renvoie le résultat suivant NULL alors que je voudrais qu'il renvoie 0.

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

0 votes

Duplication possible de Aide avec MySQL SUM()

388voto

Brad Christie Points 58505

Utilice COALESCE pour éviter ce résultat.

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

Pour le voir en action, veuillez voir ce sql fiddle : http://www.sqlfiddle.com/#!2/d1542/3/0


Plus d'informations :

Étant donné trois tableaux (un avec tous les chiffres, un avec tous les nuls, et un avec un mélange) :

Fiddle SQL

Configuration des schémas de 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 |

2 votes

Merci Brad. Cela fait très bien l'affaire.

2 votes

SELECT SUM(IFNULL(column,0)) FROM table GROUP BY n'est-il pas plus correct ? Que se passe-t-il si nous avons quelques valeurs IS NULL et quelques valeurs réelles dans "column" ?

2 votes

@DarkSide : Absolument rien. inattendu.

84voto

Mark Byers Points 318575

Utilice IFNULL o 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 qui prend deux arguments, et COALESCE est une fonction SQL standard qui peut prendre un ou plusieurs arguments. Lorsque vous n'avez que deux arguments en utilisant IFNULL est légèrement plus rapide, bien qu'ici la différence soit insignifiante puisqu'elle n'est appelée qu'une seule fois.

4 votes

Mark, quelle est la différence entre IFNULL o COALESCE Pouvez-vous l'expliquer ?

1 votes

PS. Pour tous ceux qui travaillent avec Postgres, il ne prend en charge que les éléments suivants coalesce .

6voto

Sashi Kant Points 6298

Je ne comprends pas exactement ce que vous demandez, mais si vous utilisez une fonction agrégée SUM, cela implique que vous regroupez la table.

La requête pour MYSQL se présente comme suit

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

0 votes

Vous regroupez par condition mais ne la rendez pas (vous obtiendrez un tas de montants de conditions inconnues) ?

0voto

Sreejith N Points 11

si la somme de la colonne est 0, alors l'affichage est vide

select if(sum(column)>0,sum(column),'')
from table

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X