我正在计算呼叫中心的额定呼叫数和平均评级:
select cr.queue, ROUND(AVG(TO_NUMBER(cd.datavalue)),2) as average, count(*) as count
from callrecord cr
left join calldata cd on cd.callid=cr.callid
where cd.datakey="qrate1"
group by queue
|queue |average |count |
+---------+----------+--------+
|sales |3.92 |12 |
|service |3.75 |4 |
((12个额定销售电话和4个额定服务电话。
我还可以计算总通话次数(已评级和未评级):
select cr.queue, 0 as average, count(*) as count
from callrecord cr
group by queue
|queue |average |count |
+---------+----------+--------+
|sales |0 |21 |
|service |0 |4 |
((总共21个销售电话和4个服务电话。
但是我只想计算未分级的通话。 SQL请求:
select cr.queue, 0 as average, count(*) as count
from callrecord cr
left join calldata cd on cd.callid=cr.callid
where cd.datakey!="qrate1"
group by queue
运行缓慢并产生不正确的结果,例如
|queue |average |count |
+---------+----------+--------+
|sales |0 |69 |
|service |0 |16 |
((69个未评级的销售电话和16个未评级的服务电话-错误)。>>
因此未评级的总数=总计-评级,我无法在SQL中获得此结果。
期望的结果应该是:
|queue |average |count | +---------+----------+--------+ |sales |0 |9 | |service |0 |0 |
((21-12 = 9未评级的销售电话和4-4 = 0未评级的服务电话。
CALLDATA表的示例:
|callid |datakey |datavalue | +---------+----------+-----------+ |181 |ANI |1234567890 | |181 |DNIT |2345678901 | |181 |IVR_CHOICE|SALES | |182 |ANI |1234567890 | |182 |DNIT |2345678901 | |182 |QRATE1 |1 | |183 |ANI |1234567890 | |183 |DNIT |2345678901 | |183 |LANG |ENGLISH |
最后,我为dbfiddle.uk准备了一个脚本,可以在这种情况下播放:
select * into calldata from (values ('181','ANI','1234567890') , ('181','DNIT','2345678901') , ('181','IVR_CHOICE','SALES') , ('182','ANI','1234567890') , ('182','DNIT','2345678901') , ('182','QRATE1','1') , ('183','ANI','1234567890') , ('183','DNIT','2345678901') , ('183','LANG','ENGLISH') ) z(callid,datakey,datavalue); select * into callrecord from (values ('181','SALES') , ('182','SALES' ) , ('183','SALES' ) ) z(callid,queue); GO
12行受影响select queue, count(*) as total from callrecord group by queue GO
排队|总:---- | ----:销售| 3select cr.queue, count(*) as rated from callrecord cr left join calldata cd on cr.callid=cd.callid where cd.datakey='QRATE1' group by queue GO
排队|额定的:---- | ----:销售| 1个select cr.queue, count(*) as unrated from callrecord cr left join calldata cd on cr.callid=cd.callid where cd.datakey<>'QRATE1' group by queue GO
排队|未评级:---- | ------:销售| 8select cr.queue, SUM(CASE WHEN cd.datakey='QRATE1' THEN 0 ELSE 1 END) as unrated from callrecord cr left join calldata cd on cr.callid=cd.callid group by queue GO
排队|未评级:---- | ------:销售| 8db <>小提琴here
我正在计算呼叫中心中的额定呼叫数和平均评级:选择cr.queue,将ROUND(AVG(TO_NUMBER(cd.datavalue)),2)作为平均值,将count(*)作为来自通话记录的计数cr左加入通话数据cd on ...
由于您不想统计子表,calldata