T-SQL SUM全部带有条件COUNT

时间:2013-06-18 23:19:14

标签: sql sql-server tsql

我有一个产生以下内容的查询:

Team  | Member  |  Cancelled | Rate
-----------------------------------
  1     John         FALSE      150
  1     Bill         TRUE        10
  2     Sarah        FALSE      145
  2     James        FALSE      110
  2     Ashley       TRUE         0

我需要的是选择被取消为假的团队成员数以及不考虑取消状态的费率总和......如下所示:

SELECT
    Team,
    COUNT(Member),    --WHERE Cancelled = FALSE
    SUM(Rate)         --All Rows
FROM
    [QUERY]
GROUP BY
    Team

所以结果看起来像这样:

Team  |  CountOfMember | SumOfRate
----------------------------------
  1           1                160
  2           2                255

这只是一个例子。真正的查询有多个复杂的连接。我知道我可以对费率的总和进行一次查询,然后对计数进行另一次查询,然后将这两者的结果加在一起,但是有一种更简单的方法可以减少税收并且不会导致我复制和粘贴已经复杂的查询?

1 个答案:

答案 0 :(得分:12)

你想要一个条件总和,如下所示:

sum(case when cancelled = 'false' then 1 else 0 end)

使用sum()的原因。 sum()正在处理记录并为每条记录添加01值。该值取决于cancelled的值。当它为假时,sum()增加1 - 计算此类值的数量。

您可以使用count()执行类似的操作,如下所示:

count(case when cancelled = 'false' then cancelled end)

这里的技巧是count()计算非NULL值的数量。 then子句可以是非NULL的任何内容 - cancelled,常量1或其他字段。没有其他内容,任何其他值都会转换为NULL而不计算在内。

我一直更喜欢sum()版本的count()版本,因为我觉得它更明确。在SQL的其他方言中,您有时可以将其缩短为:

sum(cancelled = 'false')

,一旦你习惯它,就会很有意义。