【发布时间】:2017-10-27 18:51:04
【问题描述】:
我在下面有一个查询正在运行,但不是我想要的。
该查询为我们的 CSR 提取电话数据,我们目前正在获取 15 个代理的数据。当前查询获得了我需要的总数,但将它们全部加起来并给了我一行总数。我想让它显示每个 CSR 的总数。这样做的问题是源表中的每个呼叫记录都有其 4 位数的扩展名作为主叫号码或被叫号码。但是,每条记录中都没有一个字段可以将该用户的分机与呼叫联系起来。它必须作为主叫号码或被叫号码存在。
所以我相信我的逻辑是正确的,除了现在我需要按分机对呼叫进行分组。因此,对于 15 个 CSR,我希望语句返回 15 行,每行都有自己的总计。但由于没有通用字段可供分组,我想我需要按两个字段进行分组。
换句话说,说“如果callingpartyno 有7200,finally calledpartyno 有7200,则将它们分组为分机7200 的总数”。
以下是数据在源表中的外观示例:
callingpartyno | finallycalledpartyno
-------------------------------------
1234 outside
1234 outside
1234 outside
outsidecall 1234
outsidecall 1234
outsidecall 1234
9876 outside
9876 outside
9876 outside
outsidecall 9876
outsidecall 9876
outsidecall 9876
如您所见,没有任何东西将每条记录标识为同一个 CSR。
这里是查询:
SELECT
sum(Duration) AS total_talk_time_seconds
, round(sum(Duration) / 60,2) AS total_talk_time_minutes
, sum(if(LEGTYPE1 = 1,1,0)) AS total_outbound
, sum(if(LEGTYPE1 = 2,1,0) and ANSWERED = 1) AS total_inbound
, sum(if(LEGTYPE1 = 2,1,0) and ANSWERED = 0) AS total_missed
, SUM(IF(LEGTYPE1 = 1, 1, 0)) + -- outbound calls
SUM(IF(LEGTYPE1 = 2, 1, 0)) AS total_calls
, NOW() AS time_of_report
, curdate() AS date_of_report
FROM cdrdb.session a
INNER JOIN cdrdb.callsummary b
ON a.NOTABLECALLID = b.NOTABLECALLID
where date(b.ts) = '2017-10-16 00:00:00'
AND callingpartyno IN (7276,7314, 7295, 7306,7357,7200,7218,7247 7331,7255,7330,7000,7215, 7240,7358,7312)
OR finallycalledpartyno IN (7276,7314, 7295, 7306,7357,7200,7218,7247 7331,7255,7330,7000,7215, 7240,7358,7312)
因此,查询再次用于提取指定日期的记录,其中任何扩展名都在 callpartyno 或 finally calledpartyno 中,但我需要一种方法将其按这两个分组并将每条记录视为 4 位数扩展名,几乎就像一个用户 ID。
【问题讨论】:
-
GROUP BY 的“肮脏”技巧:
GROUP BY callingpartyno + finallycalledpartyno。根据您的示例数据,两个字段之一将转换为0。但是,如果数字并不总是数字,这将不起作用。