28

我有一张如下表:

CallID   | CompanyID  | OutcomeID
----------------------------------
1234     | 3344       | 36
1235     | 3344       | 36
1236     | 3344       | 36
1237     | 3344       | 37
1238     | 3344       | 39
1239     | 6677       | 37
1240     | 6677       | 37

我想创建一个 SQL 脚本来计算销售结果的数量和所有其他尝试的数量(任何 <> 36),例如:

CompanyID  | SalesCount  | NonSalesCount
------------------------------------------
3344       | 3           | 1
6677       | 0           | 2

有没有办法做一个包含像 COUNT(CallID WHERE OutcomeID = 36) 这样的条件的 COUNT()?

4

5 回答 5

80

您可以将 CASE 表达式与您的聚合一起使用,以根据该outcomeId值获取总计:

select companyId,
  sum(case when outcomeid = 36 then 1 else 0 end) SalesCount,
  sum(case when outcomeid <> 36 then 1 else 0 end) NonSalesCount
from yourtable
group by companyId;

请参阅带有演示的 SQL Fiddle

于 2013-06-19T14:39:49.377 回答
5

像这样的东西:

SELECT companyId,
  COUNT(CASE WHEN outcomeid = 36 THEN 1 END) SalesCount,
  COUNT(CASE WHEN outcomeid <> 36 THEN 1 END) NonSalesCount
FROM 
  yourtable
GROUP BY 
  companyId

应该工作 -COUNT()只计算不为空值。

于 2013-06-19T14:42:27.223 回答
3

是的。Count 不计算 NULL 值,因此您可以这样做:

select
  COUNT('x') as Everything,
  COUNT(case when OutcomeID = 36 then 'x' else NULL end) as Sales,
  COUNT(case when OutcomeID <> 36 then 'x' else NULL end) as Other
from
  YourTable

或者,您可以使用 SUM,就像 bluefeet 演示的那样。

于 2013-06-19T14:41:11.607 回答
2
SELECT
    companyId, SalesCount, TotalCount-SalesCount AS NonSalesCount
FROM
    (
    select
      companyId,
      COUNT(case when outcomeid = 36 then 1 else NULL end) SalesCount,
      COUNT(*) AS TotalCount
    from yourtable
    group by companyId
    ) X;

将这种互斥模式与COUNT(*)

  • 避免评估第二个条件的(非常小的)开销COUNT
  • outcomeid如果可以为 NULL ,则给出正确的值

使用 @bluefeet 的SQLFiddle添加 NULL

于 2013-06-19T14:41:40.030 回答
1

知道COUNT()并且SUM()只计算非空值和以下规则:

true or null = true
false or null = null

为了摆弄,您可以采用 Taryn 的答案并CASE以一种超级肮脏且容易出错的方式完全规避!

select companyId,
  sum(outcomeid = 36 or null) SalesCount,
  sum(outcomeid <> 36 or null) NonSalesCount
from yourtable
group by companyId;

忘记添加一个or null,你会数一切!

于 2021-02-27T20:49:57.990 回答