Sql Server加入Sub查询

时间:2015-08-31 17:11:02

标签: sql sql-server

我有一个带有通话记录的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

由于

3 个答案:

答案 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