Para hacer esto correctamente, es posible que desee distinguir entre el caso en el que hay resultados reales NULL
en los datos que está sumando y el caso en el que no hay ningún valor para sumar.
Supongamos que tenemos el siguiente:
mysql> select * from t;
+----------+------+
| descr | num |
+----------+------+
| hiya | 5 |
| hi there | 10 |
| yo | NULL |
+----------+------+
Quisiéramos sumas vacías a ser cero, pero que involucran sumas NULL
ser NULL
. Una forma (en lugar tortuoso) de hacerlo es:
mysql> SELECT IF(has_null, NULL, total) AS sum FROM (
-> SELECT COALESCE(MAX(num IS NULL), 0) AS has_null, COALESCE(SUM(num), 0) AS total
-> FROM t WHERE num < 'ciao')
-> AS u;
+------+
| sum |
+------+
| 0 |
+------+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT IF(has_null, NULL, total) AS sum FROM (
-> SELECT COALESCE(MAX(num IS NULL), 0) AS has_null, COALESCE(SUM(num), 0) AS total
-> FROM t)
-> AS u;
+------+
| sum |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
mysql> SELECT IF(has_null, NULL, total) AS sum FROM (
-> SELECT COALESCE(MAX(num IS NULL), 0) AS has_null, COALESCE(SUM(num), 0) AS total
-> FROM t WHERE descr < 'namaste')
-> AS u;
+------+
| sum |
+------+
| 15 |
+------+
1 row in set (0.00 sec)
mysql> SELECT IF(has_null, NULL, total) AS sum FROM (
-> SELECT COALESCE(MAX(num IS NULL), 0) AS has_null, COALESCE(SUM(num), 0) AS total
-> FROM t WHERE descr > 'namaste')
-> AS u;
+------+
| sum |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
Tal vez hay una mejor manera de que no he pensado.
Desafortunadamente, el estándar SQL defines SUM
to be null when no elements are summed y MySQL no tienen más remedio que seguir ese estándar.
Esto en realidad no tiene el efecto deseado, esto también enmascarará un 'NULL' que es parte de los valores 'num'. –
Funciona, Gran solución – nitin