【问题标题】:Subtracting a value that is result of a sum减去作为总和结果的值
【发布时间】:2017-08-24 03:40:24
【问题描述】:

我的以下查询完美运行,但我需要更改计算的一部分以获得新指标。

目前它是这样呈现数据的(为了空间和时间,删除了不必要的列):

ID | Extension | Total Inbound | Total Outbound | Total Missed | Total Calls
----------------------------------------------------------------------------
1      1000          6              1                 2             7

但是,我想将其更改为从入站中减去错过。它需要继续为总数添加入站和出站,但我正在寻找这个输出:

ID | Extension | Total Inbound | Total Outbound | Total Missed | Total Calls
----------------------------------------------------------------------------
1      1000          4              1                 2             7

Insert into test.ambitionLog30Days(Extension, ExtID, Total_Talk_Time_seconds,
       Total_Talk_Time_minutes,Total_Outbound, Total_Inbound, 
       Missed_Calls, Total_Calls, Time_of_report,Date_of_report  )  
    SELECT 
        c.extension 
       ,RESPONSIBLEUSEREXTENSIONID 
       , sum(Duration)  
       , round(sum(Duration) / 60,2) 
       , sum(if(LEGTYPE1 = 1,1,0)) -- Total inbound calls 
       , sum(if(LEGTYPE1 = 2,1,0)) 
       , sum(if(Answered = 1,0,1)) -- Total Missed calls
       , sum(if(LEGTYPE1 = 1,1,0)) + sum(if(LEGTYPE1 = 2,1,0))   as total_calls 
       , b.ts
       , b.ts 
    FROM cdrdb.session a
    INNER JOIN cdrdb.callsummary b
        ON a.NOTABLECALLID = b.NOTABLECALLID
    INNER join cdrdb.mxuser c
        ON a.RESPONSIBLEUSEREXTENSIONID = c.EXTENSIONID
        WHERE b.ts BETWEEN curdate() - interval 30 day and curdate()
    -- WHERE b.ts >= '20170723' and b.ts < '20170823'
    AND c.extension IN (7276,7314,7295,7306,7357,7200,7218,7247,7331,7255,7330,7000,7215,7240,7358,7312)
    group by c.extension,b.ts
    ON duplicate key update Total_Talk_Time_seconds =values(Total_Talk_Time_seconds), 
       Total_Talk_Time_minutes =values(Total_Talk_Time_minutes), 
       Total_Outbound = values(Total_Outbound), 
       Total_Inbound = values(Total_Inbound), 
       Missed_calls = values(Missed_calls), 
       Total_Calls = values(Total_Calls),
       Time_of_report = values(Time_of_report); 

我尝试在总入站行上减去 - sum(if(Answered = 1,0,1)),但它只是将出站列中的值返回为负数,所以我认为我只是有一些语法错误。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    只做计算:

    SELECT c.extension, 
           RESPONSIBLEUSEREXTENSIONID ,
           sum(Duration),  
           round(sum(Duration) / 60, 2) ,
           sum(LEGTYPE1 = 1 and Answered = 1), -- Total inbound calls 
           sum(LEGTYPE1 = 2), 
           sum(case when Answered = 1 then 0 else 1 end)), -- Total Missed calls
           sum( LEGTYPE1 in (1, 2) ), as total_calls 
           b.ts
    

    我还通过删除if() 简化了逻辑。 MySQL 允许您将布尔表达式视为数字,1 表示真,0 表示假。注意错过可以表示为sum( Answered &lt;&gt; 1 ),如果Answered永远不是NULL

    【讨论】:

    • 为什么不sum(Answered &lt;&gt; 1 :)。否则,很好。
    • 非常感谢,这很好用!我有没有更好的方法来计算总计以将所有 3 个总列的值相加?
    • @TomN。 . . .我会倾向于在某处使用count(*)
    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2019-11-20
    • 1970-01-01
    相关资源
    最近更新 更多