2015-01-22 5 views
0

Я существующий SQL запрос, который получает статистику вызовов из телефонной системы Zultys MX250: -AVG или SUM в SQL, где значения рассчитываются на лету

SELECT 
    CONCAT(LEFT(u.firstname,1),LEFT(u.lastname,1)) AS Name, 
    sec_to_time(SUM(
     time_to_sec(s.disconnecttimestamp) - time_to_sec(s.connecttimestamp) 
    )) AS Duration, 
    COUNT(*) AS '#Calls' 
FROM 
    session s 
    JOIN mxuser u ON 
     s.ExtensionID1 = u.ExtensionId 
     OR s.ExtensionID2 = u.ExtensionId 
WHERE 
    s.ServiceExtension1 IS NULL 
    AND s.connecttimestamp >= CURRENT_DATE 
    AND BINARY u.userprofilename = BINARY 'DBAM' 
GROUP BY 
    u.firstname, 
    u.lastname 
ORDER BY 
    '#Calls' DESC, 
    Duration DESC; 

Выход следующим образом: -

 
Name Duration  #Calls 
TH  01:19:10  30 
AS  00:44:59  28 
EW  00:51:13  22 
SH  00:21:20  13 
MG  00:12:04  8 
TS  00:42:02  5 
DS  00:00:12  1 

Я пытаюсь создать четвертый столбец, который показывает среднее время вызова для каждого пользователя, но я изо всех сил пытаюсь понять, как это сделать.

Математически это просто «« Длительность »/« #Calls », но после просмотра некоторых похожих вопросов в StackOverflow, примеры запросов слишком просты, чтобы помочь мне связать мою первую.

Прямо сейчас, я даже не уверен, что можно будет разделить столбец времени на количество вызовов.

ОБНОВЛЕНИЕ: Я был так близок в своем тестировании, но все запуталось & сложнейших вещей. Вот последняя SQL (спасибо @ McAdam331 & мой приятель Джим с работы): -

SELECT 
    CONCAT(LEFT(u.firstname,1),LEFT(u.lastname,1)) AS Name, 
    sec_to_time(SUM(
     time_to_sec(s.disconnecttimestamp) - time_to_sec(s.connecttimestamp) 
    )) AS Duration, 
    COUNT(*) AS '#Calls', 
    sec_to_time(SUM(time_to_sec(s.disconnecttimestamp) - time_to_sec(s.connecttimestamp))/COUNT(*)) AS Average 
FROM 
    session s 
    JOIN mxuser u ON 
     s.ExtensionID1 = u.ExtensionId 
     OR s.ExtensionID2 = u.ExtensionId 
WHERE 
    s.ServiceExtension1 IS NULL 
    AND s.connecttimestamp >= CURRENT_DATE 
    AND BINARY u.userprofilename = BINARY 'DBAM' 
GROUP BY 
    u.firstname, 
    u.lastname 
ORDER BY 
    Average DESC; 

Выход заключается в следующем: -

 
Name Duration  #Calls Average 
DS  00:14:25  4  00:03:36 
MG  00:17:23  11  00:01:34 
TS  00:33:38  22  00:01:31 
EW  01:04:31  43  00:01:30 
AS  00:49:23  33  00:01:29 
TH  00:43:57  35  00:01:15 
SH  00:13:51  12  00:01:09 

ответ

1

Ну, вы можете получить общее количество секунд , как вы это делаете, прежде чем преобразовывать его во времени. Почему бы не взять общее количество секунд, разделите это на количество вызовов, а затем преобразуйте их обратно?

SELECT sec_to_time(
    SUM(time_to_sec(s.disconnecttimestamp) - time_to_sec(s.connecttimestamp))/COUNT(*)) 
    AS averageDuration 
+0

Или используйте 'SUM (TIMESTAMPDIFF (SECOND, s.connecttimestamp, s.disconnecttimestamp)) ' – Gervs

+1

Спасибо McAdam331 - Я пробовал ответить на ваш ответ, но я на 14 очков стесняюсь возможности! – furriephillips

+0

@furriephillips Не нужно извиняться. Если это ответ, который поможет вам, вы всегда можете принять его, нажав галочку рядом с вопросом. – AdamMc331

0

Если я правильно понимаю, вы можете просто заменить sum() с avg():

SELECT 
    CONCAT(LEFT(u.firstname,1),LEFT(u.lastname,1)) AS Name, 
    sec_to_time(SUM(
     time_to_sec(s.disconnecttimestamp) - time_to_sec(s.connecttimestamp) 
    )) AS Duration, 
    COUNT(*) AS `#Calls`, 
    sec_to_time(AVG(
     time_to_sec(s.disconnecttimestamp) - time_to_sec(s.connecttimestamp) 
    )) AS AvgDuration 
0

Похоже, все, что вам нужно, это еще одно выражение в списке выбора. Агрегат SUM() (из второго выражения), деленный на COUNT совокупность (третье выражение). Затем заверните это в функцию sec_to_time. (Если я полностью не задал вопрос.)

Лично я использовал функцию TIMESTAMPDIFF, чтобы получить разницу во времени.

SEC_TO_TIME(
    SUM(TIMESTAMPDIFF(SECOND,s.connecttimestamp,s.disconnecttimestamp)) 
/COUNT(*) 
) AS avg_duration 

Если то, что вы спрашиваете, есть ли способ ссылаться на другие выражения в списке выбора под псевдонимом ... Ответ, к сожалению, нет.

С потерей производительности, вы можете использовать существующий запрос как вложенное представление, то во внешнем запросе, имена псевдонимов, назначенные выражения доступны ...

SELECT t.Name 
    , SEC_TO_TIME(s.TotalDur) AS Duration 
    , s.`#Calls` 
    , SEC_TO_TIME(s.TotalDur/s.`#Calls`) AS avgDuration 
    FROM (
     SELECT CONCAT(LEFT(u.firstname,1),LEFT(u.lastname,1)) AS Name 
       , SUM(TIMESTAMPDIFF(SECOND,s.connecttimestamp,s.disconnecttimestamp)) AS TotalDur 
       , COUNT(1) AS `#Calls` 
      FROM session s 
       -- the rest of your query 
     ) t 
Смежные вопросы