0

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

用户:

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

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

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

我有超过 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 次扫描?如果是这样,有没有办法我可以一次扫描并根据结果一次计算呼叫?

谢谢。

4

3 回答 3

0

SQL中有GROUP BY构造。尝试:

SELECT COUNT(DISTINCT l_call_log.line_id)
  GROUP BY l_call_log.line_result
于 2009-09-10T23:23:47.933 回答
0

我猜这是一个表扫描,因为你没有任何依赖的子查询。对查询运行解释以确保。

于 2009-09-10T23:24:30.757 回答
0

这将需要一次全表扫描。

编辑:没有足够的信息来回答;因为我之前错过了重复删除 (DISTINCT),我们无法确定将使用什么策略....尤其是在不了解数据库引擎的情况下。

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

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

于 2009-09-10T23:29:56.483 回答