结合CASE的条件,mysql查询

时间:2017-09-26 11:50:56

标签: mysql sql

我试图在手机上为我们的用户完成一个不同数字的查询,看起来我的计算标准总数很好,但我现在正试图这样做:

对于每个总列数(总呼叫数,总入站数,总出站数,总错过数),我现在需要为我们的数据库中的已知数字建立一个新的列(因此我已经知道总呼叫数,总数入境知名等)。

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

在下面的查询中大约有8行,我的第一个实例似乎是显示准确的数字,但它只包含callingpartyno。我首先需要知道如何在to add finallycalledpartyno`的情况下结合这种情况。

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

这样的东西
sum(if(LEGTYPE1 = 1,1,0)) AND finallycalledpartno = k.phone_number AS Total_Outbound_known.

我希望这是有道理的,对于高级SQL程序员来说应该非常简单。在声明工作的情况下,我似乎无法获得条件组合。

以下查询:

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;

1 个答案:

答案 0 :(得分:1)

除了我在上面的评论中写的内容,我会像这样重写你的查询(我认为至少应该更容易阅读它,避免重复一些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;