6

就像一个非常简单的例子,假设我有一个test带有示例数据的表,如下所示:

a     |     b      
-------------
1     |    18
1     |    24
1     |    64
1     |    82
1     |    10
1     |     7
2     |     5
2     |    18
2     |    66
2     |    72
3     |    81
3     |    97

对于每个a,我要计算有多少b个 < 50。结果如下所示:

a     |   bcnt
--------------
1     |      4
2     |      2
3     |      0

现在我可以通过以下两种方式之一实现此结果:

SELECT a, COUNT(CASE WHEN b < 50 THEN 1 ELSE NULL END) AS bcnt
FROM test
GROUP BY a

或者:

SELECT a, SUM(CASE WHEN b < 50 THEN 1 ELSE 0 END) AS bcnt
FROM test
GROUP BY a

我知道这似乎是一件微不足道的小事,但我的问题是,在以下方面使用一种方法比另一种方法有什么优势(尽管如此微不足道):性能?......他们会在多少其他 DBMS 中工作?... 陈述的清晰性?... 等等。

4

4 回答 4

8

表现?

哦,我敢肯定,差异(如果有的话)将是微不足道的。这对我来说没什么好担心的。

他们将在多少个其他 DBMS 中工作?

我毫不怀疑两者至少可以在任何主要的SQL 产品中工作,所以,再一次,这不会是一个问题,反正对我来说也不是问题。

表述清晰?

当然COUNT更清楚地表达了您想要计算事物,而不是添加一些任意值。使用,只有在略过条件后SUM到达该部分时,您才会意识到实际意图。THEN 1

另外,如果我使用,COUNT我可以省略该ELSE NULL部分,因为这是不存在时所暗示的内容ELSEELSE 0如果我在SUM表达式中省略,我可能会得到一个NULL结果而不是可能预期的0.

另一方面,可能存在完全相反的情况,返回NULL而不是0计数结果会更方便。因此,如果我使用COUNT,我将不得不做类似的事情NULLIF(COUNT(CASE ...), 0),而使用SUM(CASE ...)它就足以省略该ELSE子句。但即使在那种情况下,我可能仍然更喜欢稍微更长的清晰度而不是稍微模糊的简洁(其他条件相同)。

于 2012-07-05T10:09:19.797 回答
3

就个人而言,我会使用

select a, count(b)
  from test
 where b < 50
 group by a

清晰,简洁,根据这个SQL fiddle比其他的要快一点(根据执行计划需要更少的数据,尽管使用这么小的表你不会注意到差异):

于 2012-07-05T08:41:44.643 回答
2

where 子句有什么问题:

select a, count(b)
from test
where b < 50
group by a
于 2012-07-05T08:36:08.480 回答
-1

使用 COUNT,您可以计算元素,使用 SUM 可以添加数字(正数、负数或零)以获得可能为负数的结果。

于 2012-07-05T08:31:45.317 回答