我有一个产生以下内容的查询:
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
这只是一个例子。真正的查询有多个复杂的连接。我知道我可以对费率的总和进行一次查询,然后对计数进行另一次查询,然后将这两者的结果加在一起,但是有一种更简单的方法可以减少税收并且不会导致我复制和粘贴已经复杂的查询?
答案 0 :(得分:12)
你想要一个条件总和,如下所示:
sum(case when cancelled = 'false' then 1 else 0 end)
使用sum()
的原因。 sum()
正在处理记录并为每条记录添加0
或1
值。该值取决于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')
,一旦你习惯它,就会很有意义。