2012-01-17 11 views
18

Belli bir ölçütle eşleşen tüm değerlerin toplamını döndüren bir sorgu yazmam gerekiyor, ancak satır boşsa, satırın bulunmaması durumunda sorgu 0 değerini döndürmesi gerekiyor.Kayıt yok ise toplam -or-0 nasıl seçilir?

tab  
+---------------+-----+ 
| descr   | num | 
+---------------+-----+ 
| hello there | 5 | 
| hi there  | 10 | 
| hello   | 10 | 
| hi there!  | 15 | 
+---------------+-----+ 

Bu sorgu: Örneğin:

SELECT sum(num) AS val FROM tab WHERE descr LIKE "%hello%"; 

ve, 15 çıkmıyor olmalıdır. Ancak:

SELECT sum(num) AS val FROM tab WHERE descr LIKE "%greetings%"; 

0 dönmelidir, ancak null çıkmıyor.

Birisi bunun mümkün olup olmadığını anlatabilir mi?

cevap

44

ne dersiniz:

COALESCE işlevi temelde "o bu durumda ikinci parametre dönmek boş olmadığı sürece, ilk parametreyi dönüş" diyor
SELECT COALESCE(sum(num), 0) AS val FROM tab WHERE descr LIKE "%greetings%"; 

- Bu senaryolarda oldukça kullanışlıdır.

+0

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. –

+0

Çalışıyor, Büyük çözüm – nitin

1

Bu çalışır:

SELECT IF(SUM(num) IS NULL, 0, SUM(num)) AS val FROM tab WHERE descr LIKE "%whatever%"; 

() üç parametre alır İSE: ifadesi doğruysa (1) yapılan açıklamada, (2) değeri uygulamak için, ve (3) değeri ise uygulanacak ifade yanlıştır.

8

MySQL documentation for IFNULL'u kontrol edin. Tabii

SELECT SUM(IFNULL(num, 0)) as val FROM tab WHERE descr LIKE "%greetings%"; 

, bu num alan null varsayar ve varsayılan değeri yoktur. Diğer olası bir çözüm, sahip olduğunuz sayıyı çözmek için num alanı için 0 varsayılanını ayarlamaktır.

+6

IFNULL SUM dışında olmalıdır, aksi halde satır bulunmazsa, boş döndürür. –

0

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.