2011-03-15 89 views
4

對於MySQL,我想要一個返回表達式SUM的查詢,除非我希望返回值爲NULL,如果包含任何表達式在SUM中是NULL。 (SUM的正常運行是忽略NULL值SQL查詢爲SUM(表達式)返回NULL,只要包含的值爲NULL

下面是說明

CREATE TABLE t4 (fee VARCHAR(3), fi INT); 
INSERT INTO t4 VALUES ('fo',10),('fo',200),('fo',NULL),('fum',400); 

SELECT fee, SUM(fi) AS sum_fi FROM t4 GROUP BY fee 

這正好返回結果集我想到一個簡單的測試用例:

fee sum_fi 
--- ------ 
fo  210 
fum 400 

我要的是一個查詢返回一個不同的結果集:

fee sum_fi 
--- ------ 
fo NULL 
fum 400 

我想要的是值爲re只要包含的值爲NULL,就將sum_fi轉換爲NULL。 (這與SUM集合函數不同,它忽略NULL,並返回非NULL表達式的總和。)

問題:可以使用什麼查詢來返回所需的結果集?

我沒有找到任何內置的聚合函數,表現出這種行爲。

+3

與標記的解決方案類似的問題:http://stackoverflow.com/questions/1288953/using-sum-so-that-null-in-columns-make-sum-null – 2011-03-15 13:57:33

+0

謝謝亞倫,我的搜索沒有找到那個問題。 – spencer7593 2011-03-17 22:12:53

回答

13

如何使用SUM(fi is NULL)來確定您的數據集中是否有NULL值? 這應該工作:

SELECT fee, IF(SUM(fi is NULL), NULL, SUM(fi)) AS sum_fi FROM t4 GROUP BY fee 
+0

謝謝,這對我來說工作得很好。 – spencer7593 2011-03-15 20:12:58

2

您可以使用此查詢:

SELECT fee, 
     IF(COUNT(fi) < (SELECT count(fee) FROM t4 temp2 WHERE temp1.fee = temp2.fee), 
      NULL, SUM(fi)) AS sum_fi 
FROM t4 temp1 GROUP BY fee 

還有這樣的解決方案:

SELECT fee, CASE WHEN COUNT(*) = COUNT(fi) THEN SUM(fi) ELSE NULL END AS sum_fi 
FROM t4 GROUP BY fee 

這是我從問題亞倫W¯¯標籤的應答所得出作爲這個的副本。無可否認,後者的形式看起來比我最初的想法要好。

+0

@ spencer7593:該查詢有一個我剛剛修復的錯誤。你可否確認? – Jon 2011-03-15 13:58:48

+0

我更喜歡第二種形式。在我的實際查詢中(而不是測試用例),行源不是一個簡單的't4',它是幾個連接了幾個謂詞的表。我不想重複t4行源的規範。 – spencer7593 2011-03-15 15:19:47

+0

謝謝 - 第二種形式對我來說工作得很好。 – spencer7593 2011-03-15 20:13:28