生成30天间隔的报告,每日总计

时间:2017-08-23 16:06:18

标签: mysql sql datetime aggregate-functions

我有以下查询,用于计算每日的CSR通话指标和总计。我现在为日常报告运行它的方法是按扩展名进行分组,并在日期和时间列中放置now()和curdate()值。但是,我现在的任务是修改这个以获得过去30天内每15个CSR的每日总计的一次性报告,所以现在就采取行动,但过去30天收集它。

在运行以下查询并从ambitionLog30Days表中选择*后,我有354行,这些行适用于周末和缺勤的日期计数。但是,总数不对。对于下面的总和列,它返回1或0,因此它基本上只显示每个CSR每天一次调用而不是总计。

以下是查询:

    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 table columns:

    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可能是一个问题,但group by也可能是一个问题。

现在,如果我只通过c.extension对上述查询进行分组,我会得到15行(有15个CSR),总计是正确的,但它们累计反映所有30天,我需要每天累计一天在30天的时间间隔内。

1 个答案:

答案 0 :(得分: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通常不适用于TIMESTAMPDATETIME数据,因为您会在范围的末尾收到一个错误的错误。

改为使用它。

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

请注意我在日期范围结束时如何使用<。这将带有ts值的所有行,直到今天午夜但不包括。另一方面,WHERE b.ts BETWEEN .... AND curdate()提取了所有昨天的记录,而今天的任何记录都恰好位于午夜。

两种配方都适用于ts列上的索引。