2015-12-28 33 views
0

我有一个将队列日志转储到MySQL的Asterisk 13 PBX,我试图做一些基本的报告 - 具体而言,代理分解的平均通话时长。Mysql - 获取两列的平均值,用where子句,按另一列分组

目前,我已经得到了这一点,这工作,但不包含所有的呼叫:

SELECT `asterisk`.`queue_log`.`agent`, count(`asterisk`.`queue_log`.`event`) AS 'calls_taken', AVG(`asterisk`.`queue_log`.`data2`) AS 'aht' 
FROM `asterisk`.`queue_log` 
WHERE `asterisk`.`queue_log`.`event` IN ("COMPLETEAGENT", "COMPLETECALLER") AND 
      `time` BETWEEN '2015-12-27' AND '2015-12-28' 
GROUP BY `agent` 
ORDER BY `agent` ASC 

我遇到的问题是,还有其他的事件代码(“BLINDTRANSFER”,“ATTENDEDTRANSFER “)将相关数据存储在data4列中,而不是data2

我怎么能基本上相结合,为其他事件data2的一些事件,并data4,然后得到一个平均的组合数据的,由agent场分组?

不幸的是,我无法真正改变应用程序的行为,使其更加一致地存储数据。

回答

1

使用IF里面AVG来选择适当的列。

SELECT agent, count(event) AS 'calls_taken', 
    AVG(IF(event in ("COMPLETEAGENT", "COMPLETECALLER") , data2, data4)) AS 'aht' 
FROM asterisk.queue_log 
WHERE event IN ("COMPLETEAGENT", "COMPLETECALLER", "BLINDTRANSFER", "ATTENDEDTRANSFER") AND 
      time BETWEEN '2015-12-27' AND '2015-12-28' 
GROUP BY agent 
ORDER BY agent ASC 
+0

这看起来像我需要的,但一个后续问题。大约有十几个事件代码,但那四个是我关心的事件代码。如果在这种情况下不能搞乱平均计算,我可以做一个嵌套吗? – csyria

+0

不确定你的意思。 'WHERE'子句将它限制为只有这4个。 – Barmar

+0

我应该在尝试之前试过!我之前正在尝试使用子查询,这让我认为'AVG'内的'IF'行为会有所不同。经过测试,效果很好,被接受为答案。谢谢! – csyria