2014-03-14 50 views
9

讓我們在下表中假設:MySQL的 - 總和只有當所有的行不爲空,否則返回空

X VALUE 
1 2 
1 3 
2 NULL 
2 4 

我想通過X與值之和分組的結果集,但只有當所有的行與每個X值相關的內容不爲空。

使用相同的例子,其結果必然是:

X SUM(VALUE) 
1 5 

正如你所看到的,X=2是不是由於(2, NULL)元組選擇。

我想,只要這是可能的,不使用子查詢。

非常感謝!

回答

12

可以實現與:

SELECT 
    x, 
    SUM(value) 
FROM 
    t 
GROUP BY 
    x 
HAVING 
    COUNT(value)=COUNT(*) 

這將工作方式如下:在正常的方式組值,但隨後比較整個計數(所以*指向)與列數(其中不包括NULL-s)。如果它們不相等,則有NULL,並且不應該包含該值。

+2

+1 Nifty,至於爲什麼我沒有想到這一點? :) –

+0

完美的工作,謝謝 – user3418803

+0

我希望我可以upvote這兩次。謝謝,很好的答案 - 簡單但不明顯 – billynoah

-1

該工作對子級:

SELECT SUM(value) FROM test WHERE value IS NOT NULL GROUP BY X 
+1

你檢查了你的答案嗎? – Sathish

+1

這將從整個組中排除NULL,但在計算聚合結果時不會影響非空值 –

2

另一種方式是這樣的。這可能是也可能不是更快:

SELECT X, IF(SUM(VALUE is NULL), NULL, SUM(VALUE)) as value 
FROM table_name 
group by X 
having not(null <=> value); 

而且,用這種方法,如果你刪除你的所有行having子句,但空值與空值相加列,你則可以有條件去做別的事在你的腳本中。

http://sqlfiddle.com/#!2/f769cc/18

相關問題