Sql 计算此数据的最佳方法

Sql 计算此数据的最佳方法,sql,performance,case,Sql,Performance,Case,简而言之,我有两张桌子: 用户: ------------------------ UserID | Name ------------------------ 0 a 1 b 2 c CALLS: ------------------------ ToUser | Result ------------------------ 0 ANSWERED 1 ENGAGED 1 ANSWERED 0 ANSWERED 等等,

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

用户:

------------------------
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次扫描?如果是这样的话,有没有一种方法可以一次扫描并根据结果计算呼叫数


谢谢。

SQL中有
GROUP BY
结构。尝试:

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

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

这将需要一次完整的表扫描

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

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


行_结果是否已索引?如果是这样,您可以利用更好的查询(GROUPBY+COUNT(*)为了利用索引统计信息,尽管我不确定这是否值得依赖于查询中的其他表。

是的,我使用group by作为标准。在本例中,我使用group by USERID,生成的表本质上是user | totalcount | answeredcount | engagedcount | UnanswerdCount我尝试为结果创建函数内索引但是它在IDE中没有什么不同-它仍然超时。有趣的是,它需要一次扫描来完成所有3个表达式。考虑到这一点,它会通过用户进行一次扫描来分组调用(初始计数)然后对每个用户进行另一次扫描以计算结果?Drat。我错过了你查询的不同部分;这改变了一切。无论如何,谢谢Alex,我认为你让我走上了正确的轨道,或者至少是正确的思维方式来改进这一点。