2017-08-23 11 views
0

以下のクエリは完全に機能しますが、新しいメトリックの計算の一部を変更する必要があります。合計の結果である値を減算する

現在は(空間と時間のために不要な列を削除する)このようなデータを提示ます:

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))を引いてみましたが、それは単に負の数として私のアウトバウンドの列の値を返さだから私は文法が間違っていると思う。

答えて

2

ただ計算を実行します。

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では、boolean式を数値として扱うことができます。真は1、偽は0です。 Answeredが決してNULLでない場合、見逃しはsum(Answered <> 1)と表現できます。

+0

なぜ 'sum(Answered <> 1' :)ではないのですか?そうでなければ、いい。 – hummingBird

+0

ありがとう、これは素晴らしいです! 3つの合計列すべての値を加算するために合計を計算する方法がありますか? –

+0

@TomN。 。 。 。私はどこかで 'count(*)'を使う傾向があります。 –

関連する問題