【问题标题】:Generating report for 30 day interval, daily totals生成 30 天间隔的报告,每日总计
【发布时间】:2018-02-01 07:59:04
【问题描述】:

我有以下查询,旨在计算 CSR 呼叫指标和每天的总数。我现在为每日报告运行它的方式是按扩展名分组,并将 now() 和 curdate() 值放在日期和时间列中。但是,我现在的任务是对其进行修改,以获取过去 30 天内每 15 个 CSR 的每日总计的一次性报告,因此请采取现在正在做的事情,但要收集过去 30 天的数据。

运行以下查询并从野心Log30Days 表中选择* 后,我有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     

调用汇总表列:

    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 天为间隔。

【问题讨论】:

    标签: mysql sql datetime aggregate-functions


    【解决方案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()
    

    注意我是如何使用&lt; 作为日期范围结束的。这会拉入所有具有 ts 值的行,直到今天午夜,但不包括。另一方面,WHERE b.ts BETWEEN .... AND curdate() 提取了昨天的所有记录,以及今天恰好在午夜发生的任何记录。

    两种公式都适用于 ts 列上的索引。

    【讨论】:

    • 我终于想通了,但感谢您正式解决了我的问题!
    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多