1

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

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

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

4

1 回答 1

12

你想要一个有条件的总和,像这样:

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

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

你可以用 做类似的事情count(),像这样:

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

这里的技巧是count()计算非 NULL 值的数量。该then子句可以是任何非 NULL -- cancelled、常量1或其他字段。如果没有 else,则任何其他值都将转换为NULL并且不计入。

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

sum(cancelled = 'false')

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

于 2013-06-18T23:20:31.287 回答