我有以下查询,用于计算每日的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天的时间间隔内。
答案 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
通常不适用于TIMESTAMP
或DATETIME
数据,因为您会在范围的末尾收到一个错误的错误。
改为使用它。
WHERE b.ts >= curdate() - interval 30 day
AND b.ts < curdate()
请注意我在日期范围结束时如何使用<
。这将带有ts
值的所有行,直到今天午夜但不包括。另一方面,WHERE b.ts BETWEEN .... AND curdate()
提取了所有昨天的记录,而今天的任何记录都恰好位于午夜。
两种配方都适用于ts
列上的索引。