【问题标题】:Combining conditions for CASE, mysql queryCASE、mysql查询的组合条件
【发布时间】:2017-09-26 20:33:41
【问题描述】:

我正在尝试完成一个查询,以便在电话上为我们的人员计算不同的总数,并且我的标准总数似乎计算得很好,但我现在正在尝试这样做:

对于每个总列(总呼叫、总呼入、总呼出、总未接),我现在需要有一个与之合作的新列,用于我们数据库中的已知号码(所以我将知道总呼叫,总呼入已知, ETC。)。

我这样做的方法是检查session 表中的两个字段:callingpartynofinallycalledpartyno。因此,对于session 中的每个呼叫,我都需要检查其中任何一个字段中的数字是否在我的knownNumbers 表中的phone_number 字段中。如果是这样,我需要为已知列计算它们。

在下面的查询中大约有 8 行,我有我的第一个实例,它似乎显示了准确的数字,但它只包含callingpartyno。我首先需要知道在这种情况下如何组合条件 whento addfinallycalledpartyno 也是如此。

另一个问题是,对于入站和出站,我需要将我正在使用的电话号码字段基于 LEGTYPE 字段。因此,例如,如果我正在计算对已知号码的出站呼叫,我需要类似

sum(if(LEGTYPE1 = 1,1,0)) AND finallycalledpartno = k.phone_number AS Total_Outbound_known.

我希望这是有道理的,并且对于高级 SQL 程序员来说应该非常简单。在 case when 语句特别有效时,我似乎无法获得条件组合。

以下查询:

SELECT u.firstn
      ,u.lastn
      ,c.extension
      ,SUM(IF(LEGTYPE1 = 1, 1, 0)) +                   -- outbound calls
       SUM(IF(LEGTYPE1 = 2, 1, 0) AND ANSWERED = 1) +  -- inbound calls
       SUM(IF(Answered = 1, 0, 1))  AS Total_Calls
      ,sum(case when CALLINGPARTYNO = k.phone_number  then 1 else 0 end ) AS total_known
      ,sum(if(Answered = 1,0,1)) AS Total_Missed
      ,sum(if(LEGTYPE1 = 2,1,0) and ANSWERED = 1) AS Total_Recieved
      ,sum(if(LEGTYPE1 = 1,1,0)) AS Total_Outbound
      ,round(sum(Duration) / 60,2) AS Total_Talk_Time_minutes
      ,sum(if(Answered = 1,0,1)) / (SUM(IF(LEGTYPE1 = 1, 1, 0)) +                   -- outbound calls
       SUM(IF(LEGTYPE1 = 2, 1, 0) AND ANSWERED = 1) +  -- inbound calls
       SUM(IF(Answered = 1, 0, 1)))  * 100 AS Percentage_Missed
FROM ambition.session a
INNER JOIN ambition.callsummary b
ON a.NOTABLECALLID = b.NOTABLECALLID
INNER join ambition.mxuser c
ON a.RESPONSIBLEUSEREXTENSIONID = c.EXTENSIONID
INNER join jackson_id.users u
on c.extension = u.extension
left join ambition.knownnumbers k
on a.callingpartyno = k.phone_number
WHERE b.ts between curdate() - interval 5 day and now()
AND c.extension IN (7276,7314,7295,7306,7357,7200,7218,7247,7331,7255,7330,7000,7215,7240,7358,7312)
group by c.extension;

【问题讨论】:

  • 那个 GROUP BY 无效。将在较新的 MySQL 版本上引发错误(除非在兼容模式下),并在旧版本中返回不可预测的数据。一般的 GROUP BY 规则说:“如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须要么标识一个分组列,要么是一个集合函数的参数。”
  • 这就是我对这些数据运行查询数周的方式,它运行良好。当我删除它时,它只给我一行数据和一个 CSR 名称,但它包含 CSR 的所有累积总数。因此,我得到的不是 15 行的单独总计,而是一排的总计巨大
  • 为了获得帮助,我建议发布示例数据和所需的输出
  • 关于您为 Total_Outbound_known 提供的示例,我认为您可以使用以下内容:SUM (CASE WHEN LEGTYPE1 = 1 AND finallycalledpartno = k.phone_number THEN 1 ELSE 0 END) AS Total_Outbound_known
  • 是的,谢谢@etsa,我一直在尝试这个约定,它似乎适用于所有事情,我仍然得到 0 表示出站已知,但我的其他总数匹配,所以看起来数字实际上可能是准确的。我只是在测试是否需要在此处添加到我的示例中。

标签: mysql sql


【解决方案1】:

除了我在上面的 cmets 中写的,我会像这样重写你的查询(我认为至少应该更容易阅读,避免重复一些 SUM)

SELECT firstn
    , lastn
    , extension
    , Total_Outbound+Total_Missed+Total_Received AS Total_Calls
    , Total_Known
    , Total_Missed
    , Total_Received
    , Total_Outbound
    , Total_Talk_Time_minutes
    , Total_Missed  / (Total_Outbound+Total_Missed+Total_Received)  * 100 AS Percentage_Missed
FROM (
      SELECT u.firstn
    , u.lastn
    , c.extension       
    , sum(case when CALLINGPARTYNO = k.phone_number  then 1 else 0 end ) AS Total_Known
    , sum(if(Answered = 1,0,1)) AS Total_Missed
    , sum(CASE WHEN LEGTYPE1 = 2 AND ANSWERED = 1 THEN 1 ELSE 0 END) AS Total_Received
    , sum(if(LEGTYPE1 = 1,1,0)) AS Total_Outbound
    , round(sum(Duration) / 60,2) AS Total_Talk_Time_minutes
      FROM ambition.session a
      INNER JOIN ambition.callsummary b ON a.NOTABLECALLID = b.NOTABLECALLID
      INNER join ambition.mxuser c ON a.RESPONSIBLEUSEREXTENSIONID = c.EXTENSIONID
      INNER join jackson_id.users u ON c.extension = u.extension
      LEFT JOIN ambition.knownnumbers k ON a.callingpartyno = k.phone_number
      WHERE b.ts between curdate() - interval 5 day and now()
      AND c.extension IN (7276,7314,7295,7306,7357,7200,7218,7247,7331,7255,7330,7000,7215,7240,7358,7312)
      GROUP BY c.extension, u.firstn, u.lastn  
     ) X;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2011-03-04
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多