简而言之,我有两张桌子:

USERS:

------------------------
UserID   |   Name
------------------------
0     a
1     b
2     c

CALLS:
------------------------
ToUser   |   Result
------------------------
0     ANSWERED
1     ENGAGED
1     ANSWERED
0     ANSWERED

Etc等(我在现实中使用数字参考结果)

我有超过200万条记录,每条记录详细说明了对特定客户的呼叫。目前我正在使用Case语句来计算特定结果的每次计算后我已经完成了快速总计数:

COUNT(DISTINCT l_call_log.line_id),
COALESCE (SUM(CASE WHEN l_call_log.line_result = 1 THEN 1 ELSE NULL END), 0) AS [Answered],
COALESCE (SUM(CASE WHEN l_call_log.line_result = 2 THEN 1 ELSE NULL END), 0) AS [Engaged], 
COALESCE (SUM(CASE WHEN l_call_log.line_result = 4 THEN 1 ELSE NULL END), 0) AS [Unanswered]

在我的初始总数之后,我是否对数据进行了3次扫描?如果是这样,有没有办法可以一次扫描并按顺序计算每次调用的次数?

感谢。

有帮助吗?

解决方案

这将需要一次全表扫描。

编辑:没有足够的信息可以回答;因为我之前错过了重复删除(DISTINCT),我们不知道将使用什么策略....特别是在不知道数据库引擎的情况下。

在几乎每个主要查询引擎中,每个每行每个列执行一次聚合函数,并且它可以使用缓存结果(例如COUNT(*))。

是否对line_result编制了索引?如果是这样,您可以利用更好的查询(GROUP BY + COUNT(*)来利用索引统计信息,但我不确定这是否值得,具体取决于查询中的其他表。

其他提示

SQL中有 GROUP BY 构造。尝试:

SELECT COUNT(DISTINCT l_call_log.line_id)
  GROUP BY l_call_log.line_result

我猜它是一个表扫描,因为你没有任何依赖子查询。对查询运行说明以确定。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top