Bunu doğru yapmak için, topladığınız verilerde gerçek NULL
sonuçlarının bulunduğu durum ile, toplam değerlerin olmadığı bir durum olduğu durumu ayırt etmek isteyebilirsiniz.
şu olduğunu varsayalım: Biz sıfır olması boş meblağlar istiyorum
mysql> select * from t;
+----------+------+
| descr | num |
+----------+------+
| hiya | 5 |
| hi there | 10 |
| yo | NULL |
+----------+------+
ancak NULL
karıştığı toplamlar NULL
olmak. Bunu yapmanın bir (daha doğrusu işkence) yoludur:
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)
Belki düşünce değil, daha iyi bir yol var.
Ne yazık ki, SQL standardı defines SUM
to be null when no elements are summed ve MySQL'in bu standardı izlemek dışında bir seçeneği yoktur.
Bu aslında istenen bir etkiye sahip değil - bu aynı zamanda "num" değerlerinin kendisinin bir parçası olan bir "NULL" u da gizleyecektir. –
Çalışıyor, Büyük çözüm – nitin