mysql - 针对单个条件按多列分组

标签 mysql sql

我在下面有一个查询正在运行,但不是我想要的那样。

查询为我们的 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/

相关文章:

php - MySQL - 这个和这个或这个

sql - 检索每个组中的最后一条记录-MySQL

c# - 替代 ToString() 进行索引搜索(C# 转换为 SQL)

sql - SQLite-每组第一个-组合顺序和反对排序顺序

mysql - 使用字符串匹配对查询结果进行重复数据删除

php - 表单未将数据插入mysql数据库

php - 如何使用 PHP 跳转到 MySQL 中的特定行

php - 在插入时自动将字符串剪辑到适当的长度

c# - SQL连接为什么会留下参数?

c# - c#中SQL时间戳的等效类型是什么