【问题标题】:T-SQL SUM All with a Conditional COUNT带有条件 COUNT 的 T-SQL SUM 全部
【发布时间】:2013-06-15 08:36:57
【问题描述】:

我有一个查询产生以下结果:

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

我需要的是选择取消为 false 的团队的成员数量以及无论取消状态如何的费率总和......像这样:

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

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

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

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

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

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

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

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

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

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

    sum(cancelled = 'false')
    

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

    【讨论】:

    • 使用 SUM 而不是 COUNT。真是天才!
    • @GordonLinoff:可能值得一提的是为什么我们需要SUM 而不是COUNT。
    • @TimSchmelter 你不一定需要Sum:Count(CASE WHEN Cancelled = 'false' THEN 1 END) 也可以,尽管我同意Sum 是更好的形式。最近,我玩弄了Count((SELECT 1 WHERE Cancelled = 'false')),虽然它也可能不是最好的形式。
    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    相关资源
    最近更新 更多