2017-08-23 1 views
1

CSRコールメトリックと1日の合計を計算するための以下のクエリがあります。私が今日報を実行する方法は、日付と時刻の列にnow()とcurdate()の値をグループ化して配置することです。しかし、私は今、これを変更して、過去30日間の15のCSRあたりの1日合計の1回限りのレポートを取得するように任命しました。したがって、今行っていることを取るが、過去30日間はそれを集める。30日間隔、1日合計のレポートを生成

以下のクエリを実行してambitionLog30Daysテーブルから*を選択すると、週末と休暇の日のカウントに適した行が354行あります。しかし、合計は正しくありません。以下の合計列では、1または0が返されるため、総計ではなく、1日あたりCSRあたり1つのコールしか表示されません。

ここでは、クエリです:

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)) 
     , sum(if(LEGTYPE1 = 2,1,0)) 
     , sum(if(Answered = 1,0,1)) 
     , 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() 
    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); 

セッションテーブル列:

RESPONSIBLEUSEREXTENSIONID bigint(20) YES  

callsummaryテーブル列:

NOTABLECALLID bigint(20) YES UNI  
    STARTTIME datetime YES MUL  
    ENDTIME datetime YES MUL  
    DURATION int(11) YES MUL  
    ANSWERED smallint(6) YES   
    ts timestamp NO MUL CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP 
    firstcallid bigint(20) YES   

mxuserのテーブル列:

EXTENSIONID bigint(20) NO PRI 0 
    USERID bigint(20) YES MUL  
    ISLAST smallint(6) YES   
    FIRSTNAME varchar(32) YES   
    LASTNAME varchar(32) YES   
    USERPROFILENAME varchar(32) YES MUL  
    EXTENSION varchar(8) NO   
    ts timestamp NO MUL CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP 
    PRESENCENOTE varchar(64) YES   
現在のクエリーからの

いくつかのサンプルデータ:

ID | Ext | extID | TTTS | TTTM | TI | TO | MC | TC | DOR  | TOR 
    1  7200 35298  5  0.08 1  1 0 1 2017-08-03 2017-08-03 16:19:48 
    2  7215 35295  116  1.93 1  1 0 1 2017-08-03 2017-08-03 16:41:32 
    3  7218 35302  11  0.18 0  1 0 0 2017-08-03 2017-08-03 16:43:47 
    4  7240 35417  79  1.32 1  1 0 1 2017-08-21 2017-08-21 19:13:38 
    5  7247 35296  40  0.67 0  1 0 0 2017-08-03 2017-08-03 16:55:50 
    6  7255 34935  65  1.08 1  1 0 1 2017-08-21 2017-08-21 18:57:07 
    7  7276 35299  146  2.43 1  1 0 1 2017-08-21 2017-08-21 20:37:18 
    8  7295 35439  92  1.53 1  1 0 1 2017-08-21 2017-08-21 15:44:36 
    9  7306 35283  108  1.8  1  1 1 1 2017-08-03 2017-08-03 21:34:47 
    10 7312 35404  54  0.9  1  1 1 1 2017-08-09 2017-08-09 16:56:51 
    11 7314 35352  35  0.58 1  1 1 1 2017-08-03 2017-08-03 14:47:33 
    12 7330 35297  38  0.63 1  1 0 1 2017-08-03 2017-08-03 16:45:05 

予想されるデータは同じフォーマットが、日付ごとのCSRごとに複数の呼び出しでなければなりません。 upsertが問題になるかもしれないようですが、by groupも問題になる可能性があります。

ここで、上記のクエリをc.extensionだけでグループ化すると、15行(15個のCSRがあります)が得られますが、合計は正しくなりますが、30日をすべて累積して反映します。 30日間隔で1日。

答えて

1

あなたの質問には、これらの行があります。

WHERE b.ts BETWEEN curdate() - interval 30 day and curdate() 
AND ... 
group by c.extension,b.ts 

タイムスタンプでグループ化しています。試してみてください

group by c.extension 

あなたが必要な結果を得ることがあります。

また、暦日ごとにグループ化する場合は、GROUP BY ... DATE(b.ts)を使用してください。

WHERE句によくあるエラーがあります。 BETWEENは、TIMESTAMPまたはDATETIMEのデータには一般的に不適切です。これは、範囲の最後にオフ・バイ・エラーが発生するためです。

これを代わりに使用してください。

WHERE b.ts >= curdate() - interval 30 day 
    AND b.ts < curdate() 

どのように日付範囲の末尾に<を使用したかに注目してください。これにより、まではtsの値を持つすべての行が引き出されますが、今日の深夜のは含まれません。一方、WHERE b.ts BETWEEN .... AND curdate()はすべての昨日の記録を引き出し、今日からの記録は深夜に正確に記録されます。

どちらの製剤も、tsカラムのインデックスで正常に機能します。

+0

私はついにこれを理解しましたが、正式に問題を解決してくれてありがとう! –

関連する問題