¿Cómo obtengo la función SUMA en MySQL para devolver '0' si no se encuentran valores?


150

Digamos que tengo una función simple en MySQL:

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

Si ninguna entrada en Column_2 contiene el texto 'Prueba', esta función regresa NULL, mientras que me gustaría que devuelva 0.

Soy consciente de que se ha formulado una pregunta similar varias veces aquí, pero no he podido adaptar las respuestas a mis propósitos, por lo que agradecería un poco de ayuda para solucionarlo.


posible duplicado de Ayuda con MySQL SUM ()
JohnFx

Respuestas:


305

Use COALESCEpara evitar ese resultado.

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

Para verlo en acción, consulte este violín de sql: http://www.sqlfiddle.com/#!2/d1542/3/0


Más información:

Dadas tres tablas (una con todos los números, una con todos los valores nulos y otra con una mezcla):

Violín de SQL

Configuración del esquema 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);

Consulta 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

Resultados :

| 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
Gracias Brad. Eso hace bien el trabajo.
Nick

1
¿No es SELECT SUM (IFNULL (column, 0)) FROM table GROUP BY algo más correcto? ¿Qué pasa si tenemos algunos valores IS NULL y algunos valores reales en "columna"?
DarkSide

2
@DarkSide: Absolutamente nada inesperado.
Brad Christie

@BradChristie sí, tienes toda la razón. SUM también funciona bien con valores NULL.
DarkSide

1
Tenga en cuenta que mientras SUMfunciona según lo deseado, AVGy COUNTpuede producir resultados diferentes cuando NULLlo recibe, solicitándole que lo use COALESCEsegún lo sugerido por @DarkSide, dependiendo de su resultado deseado.
fyrye

65

Usar IFNULLo COALESCE:

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

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

La diferencia entre ellos es que IFNULLes una extensión MySQL que toma dos argumentos, y COALESCEes una función SQL estándar que puede tomar uno o más argumentos. Cuando solo tiene dos argumentos, el uso IFNULLes ligeramente más rápido, aunque aquí la diferencia es insignificante ya que solo se llama una vez.


3
@ Mark, ¿cuál es la diferencia b / w IFNULLo COALESCE?? ¿podrías explicarlo?
mo sean

1
PD. Para cualquiera que trabaje con Postgres, solo es compatible coalesce.
Siddhartha

4

No se puede obtener exactamente lo que está pidiendo, pero si está utilizando una función SUMA agregada que implica que está agrupando la tabla.

La consulta va para MYSQL como este

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

¿Agrupa por condición pero no la devuelve (obtendrá un montón de cantidades de condiciones desconocidas)?
Lluis Martínez
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.