简而言之,我有两张桌子:
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次扫描?如果是这样,有没有办法可以一次扫描并按顺序计算每次调用的次数?
感谢。
答案 0 :(得分:0)
SQL中有GROUP BY
构造。尝试:
SELECT COUNT(DISTINCT l_call_log.line_id)
GROUP BY l_call_log.line_result
答案 1 :(得分:0)
我猜它是一个表扫描,因为你没有任何依赖子查询。对查询运行说明以确定。
答案 2 :(得分:0)
这将需要一次全表扫描。
编辑:没有足够的信息可以回答;因为我之前错过了重复删除(DISTINCT),我们不知道将使用什么策略....特别是在不知道数据库引擎的情况下。
在几乎每个主要查询引擎中,每个每行每个列执行一次聚合函数,并且它可以使用缓存结果(例如COUNT(*))。
是否对line_result编制了索引?如果是这样,您可以利用更好的查询(GROUP BY + COUNT(*)来利用索引统计信息,但我不确定这是否值得,具体取决于查询中的其他表。