2015-08-31 3 views
0

У меня есть таблица SQL Server с записями вызовов, и я бы хотел получить общее количество звонков и общее количество полученных вызовов.Sql Server Присоединиться к Sub Query

Вот что таблица выглядит следующим образом:

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) запрос вы вывесили не является действительным. Подумайте об этом. 2) Ваш запрос, кажется, подразумевает, что вы хотите, чтобы подсчеты были на расширение, но в тексте вам, похоже, нужны подсчеты по всей таблице. Который из них? – sstan

ответ

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 

Я предполагаю, что вы пытаетесь вернуть суммы за расширение.

EDIT

Я должен признать, что ваш пост в его нынешнем виде не 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 
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'; 

Вы можете использовать функции окна для достижения этой цели. Должно работать нормально.

+1

Я считаю, что общий счет должен включать в себя также и не ответы. – Hogan

+0

Возможно, вы правы. Если это так, ваш ответ правильный. –

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 
Смежные вопросы