對列執行Sum()會基於group by將該列中的值相加。但讓我們說,只有當所有的值不爲0或不爲0時,我纔想要求和這些值,然後我需要一個子句,它檢查是否有任何值是0,然後再執行總和。我怎樣才能實施這樣的條款?如果在分組時使用任何子句
我使用的是SQL Server 2005中
感謝,
巴里
對列執行Sum()會基於group by將該列中的值相加。但讓我們說,只有當所有的值不爲0或不爲0時,我纔想要求和這些值,然後我需要一個子句,它檢查是否有任何值是0,然後再執行總和。我怎樣才能實施這樣的條款?如果在分組時使用任何子句
我使用的是SQL Server 2005中
感謝,
巴里
讓我們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.
從SUM中消除0是沒有意義的,因爲它不會影響總和。 但是你可能要總結基於另一個字段:
select FIELD, sum(
case when(OTHER_FIELD>0) then FIELD
else 0
end)
from TABLE
group by TABLE
你說,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
我不認爲你可以實現這在一個簡單的查詢。您需要在代碼中執行此操作:存儲過程/函數或應用程序代碼。你當然可以做的是運行兩個查詢:一個查詢你是否有空值或0值,如果不是,那麼運行第二個查詢來求和值。 – 2012-03-30 11:48:34
但是:0 + 0 + 2 + 3 = 5和2 + 3 = 5所以有什麼意義(消除零點)? – 2012-03-30 11:50:09
@MichałPowaga,重讀的問題。 '0 + 0 + 2 + 3 =排除這個組。' – danihp 2012-03-30 11:55:11