我有一个带有通话记录的SQL Server表,我希望得到总呼叫次数和总呼叫数。
这是表格的样子:
Extension | Status
-----------------------
300 Answered
200 Not Answered
.... ...
什么是最有效的方式来编写一个返回扩展名的查询,总呼叫数(整个表上的计数)和已接听电话的数量(计算Status = 'Answered'
的位置?)
我创建了一个子查询并加入了它,但它似乎效率低下,所以我有
SELECT Extension, COUNT(*) AS total, answered.num as totalAnswered
FROM calls c INNER JOIN (SELECT Extension, COUNT(*) AS num FROM calls
WHERE Status = 'answered') answered ON c.Extension = answered.Extension
GROUP BY Extension, answered.num
由于
答案 0 :(得分:1)
SELECT DISTINCT Extension
, COUNT(*) OVER() AS total
, COUNT(*) OVER(PARTITION BY C.Extension) AS totalAnswered
FROM dbo.calls AS C
WHERE C.Status = 'answered';
您可以使用Windows功能来实现这一目标。应该工作得很好。
答案 1 :(得分:1)
通过case
汇总功能中的count
语句,您可以使用group by
保持查询非常简单。
select extension,
count(*) as total,
count(case when status = 'answered' then 'X' end) as totalAnswered
from calls
group by extension
我假设您正在尝试返回每个扩展程序的总计。
修改强>
我必须承认,您当前表格中的帖子并非100%明确您的意图。您发布的查询意味着您希望计数每个扩展名。如果是这种情况,那么上述查询将会很有效。
但是在帖子的文字中你说:
总通话次数(计入整个表格)
...这似乎暗示了一些不同之处:您不希望计数每个分机。
为了完整性,如果您希望计数对整个表是全局的,而不是每个扩展,则可以使用以下查询:
select distinct extension,
count(*) over () as total,
count(case when status = 'answered' then 'X' end) over () as totalAnswered
from calls
而且,如果由于某种原因,你需要两种计数的组合,那么你可以使用这样的东西:
select extension,
count(*) as totalPerExtension,
count(case when status = 'answered' then 'X' end) as totalAnsweredPerExtension,
totalGlobal,
totalAnsweredGlobal
from (select *,
count(*) over () as totalGlobal,
count(case when status = 'answered' then 'X' end) over () as totalAnsweredGlobal
from calls) c
group by extension, totalGlobal, totalAnsweredGlobal
答案 2 :(得分:1)
SELECT Extention,
COUNT(*) as total,
SUM(answered) OVER (PARTITION BY Extention) as answered
FROM (
SELECT Extention,
CASE WHEN Status = 'answered' THEN 1 ELSE 0 END as answered
) T