在Case语句中使用Multiple And而不是子查询

时间:2012-05-21 18:00:26

标签: sql sql-server tsql

我在案例声明中使用多个时遇到问题。

我的数据库看起来像:

Enrollment      Paperless      Validated
0               1              0
1               0              1
0               1              0
1               1              1
0               0              0
0               1              0
0               0              0
0               1              0
1               1              1
0               1              0

所以我的查询如下:

Select
    Count(case when [Enrollment] = 1 and [Paperless] = 1 and [Validated] = 1 then 1 else 0 end) as [Paperless]
    ,Count(case when [Enrollment] = 1 and [Paperless] = 1 and [Validated] = 1 then 1 else 0 end) as [Online_Only]
    ,Count(*) as "Total"
FROM [my_table]

Sql Fiddle:http://sqlfiddle.com/#!3/61202/5

正如你从sql小提琴中看到的那样,当case语句中的count应该是不同的时,count总是为20。我只是在我的案例陈述中做错了什么,还是我必须在子查询中做这些?

戴夫

2 个答案:

答案 0 :(得分:6)

无论实际值如何,

COUNT都返回true。所以使用:

SUM(CASE ...)

而不是

COUNT(CASE ...)

答案 1 :(得分:2)

以下是另外两种选择:

(1)您可以使用COUNT(),但删除ELSE子句。这将导致NULL而不是0,因此不会计算它们。

(2)您也可以切换到数学运算:

SELECT SUM(Enrollment*Paperless*Validated) as <whatever>,
       SUM(Enrollment*(1-PaperLess)*Validated) as <something else>

就个人而言,我经常喜欢乘法形式,因为语句较短,我可以更经常地看到所有条件而无需滚动。