我在下面有一个查询正在运行,但不是我想要的那样。
查询为我们的 CSR 提取电话数据,我们目前正在获取 15 个代理的数据。当前查询获取我需要的总计,但将它们全部加起来并给出一行总计。我想让它显示每个 CSR 的总数。问题在于源表中的每个调用记录都有其 4 位扩展名作为主叫号码或被叫号码。但是,每条记录中都没有一个字段可以将该用户的分机号与调用联系起来。它必须作为主叫号码或被叫号码存在。
所以我相信我的逻辑是正确的,只是现在我需要按分机对调用进行分组。因此对于 15 个 CSR,我希望语句返回 15 行,每行都有自己的总计。但由于没有通用字段可作为分组依据,我认为我需要按这两个字段进行分组。
换句话说,“如果 callingpartyno 有 7200 而 finallycalledpartyno 有 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)
再一次,查询可以提取指定日期的记录,其中任何扩展名都在 callingpartyno 或 finallycalledpartyno 中,但我需要一种方法将其按这两个分组并将每条记录视为 4 位扩展名,几乎就像一个用户 ID。
最佳答案
这正是 group by
子句的用途。通过插入 case
语句,我们可以使用您自己的条件创建一个 ID。
select
case
when callingpartyno in (7276,7314,7295,7306,7357,7200,7218,7247,7331,7255,7330,7000,7215,7240,7358,7312)
then callingpartyno
when finallycalledpartyno in (7276,7314,7295,7306,7357,7200,7218,7247,7331,7255,7330,7000,7215,7240,7358,7312)
then finallycalledpartyno
end as id
, 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
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)
)
group by
id -- <-- the calculated field we created in the select clause
我还更正了您的 或
声明。像您一样在括号外使用它会使日期或多或少变得无关紧要。
关于mysql - 针对单个条件按多列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46981661/