如果分组时有任何条款

时间:2012-03-30 11:45:55

标签: sql-server sql-server-2005

对列执行Sum()会根据group by将该列中的值相加。但是,假设我只想在所有值都不为空或不为0的情况下对这些值求和,那么我需要一个子句来检查任何值是否为0,然后才能求和。我该如何实施这样的条款?

我正在使用sql server 2005。

谢谢,

百里

3 个答案:

答案 0 :(得分:2)

让我们的表架构为:

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.

答案 1 :(得分: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

答案 2 :(得分:0)

从SUM中消除0是没有意义的,因为它不会影响总和。 但是您可能希望基于另一个字段进行SUM:

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