2012-03-30 13 views
0

對列執行Sum()會基於group by將該列中的值相加。但讓我們說,只有當所有的值不爲0或不爲0時,我纔想要求和這些值,然後我需要一個子句,它檢查是否有任何值是0,然後再執行總和。我怎樣才能實施這樣的條款?如果在分組時使用任何子句

我使用的是SQL Server 2005中

感謝,

巴里

+0

我不認爲你可以實現這在一個簡單的查詢。您需要在代碼中執行此操作:存儲過程/函數或應用程序代碼。你當然可以做的是運行兩個查詢:一個查詢你是否有空值或0值,如果不是,那麼運行第二個查詢來求和值。 – 2012-03-30 11:48:34

+0

但是:0 + 0 + 2 + 3 = 5和2 + 3 = 5所以有什麼意義(消除零點)? – 2012-03-30 11:50:09

+0

@MichałPowaga,重讀的問題。 '0 + 0 + 2 + 3 =排除這個組。' – danihp 2012-03-30 11:55:11

回答

2

讓我們supose你的表架構是:

myTable(id, colA, value) 

於是,一種方法是:

Select colA, sum(value) 
from myTable 
group by colA 
having count(id) = count(nullif(value, 0)) 

請注意,nullif是MSSQL服務器功能。你應該把代碼改編成你的rdbms品牌。

說明:

count聚合函數只能算不爲空值。 Here a counting null values test.

0

從SUM中消除0是沒有意義的,因爲它不會影響總和。 但是你可能要總結基於另一個字段:

select FIELD, sum(
        case when(OTHER_FIELD>0) then FIELD 
         else 0 
        end) 
from TABLE 
group by TABLE 
1

你說,0 + 2 + 3 =這種情況下0。假設NULL + 2 + 3也應該是零:

SELECT GroupField, 
    SUM(Value) * MIN(CASE WHEN COALESCE(Value, 0) = 0 THEN 0 ELSE 1 END) 
FROM SumNonZero 
GROUP BY GroupField 

上面的語句給出了這樣的結果

GroupField (No column name) 
case1  5 
case2  0 
case3  0 

與這個測試數據

CREATE TABLE SumNonZero (
    GroupField CHAR(5) NOT NULL, 
    Value INT 
) 

INSERT INTO SumNonZero(GroupField, Value) 
SELECT 'case1', 2 
UNION ALL SELECT 'case1', 3 
UNION ALL SELECT 'case2', 0 
UNION ALL SELECT 'case2', 2 
UNION ALL SELECT 'case2', 3 
UNION ALL SELECT 'case3', NULL 
UNION ALL SELECT 'case3', 3 
UNION ALL SELECT 'case3', 4