如何计算Informix SQL中的差异?

问题描述 投票:0回答:1

我正在计算呼叫中心的额定呼叫数和平均评级:

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
排队|总:---- | ----:销售| 3
select 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
排队|未评级:---- | ------:销售| 8
select 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
排队|未评级:---- | ------:销售| 8

db <>小提琴here

我正在计算呼叫中心中的额定呼叫数和平均评级:选择cr.queue,将ROUND(AVG(TO_NUMBER(cd.datavalue)),2)作为平均值,将count(*)作为来自通话记录的计数cr左加入通话数据cd on ...

sql informix
1个回答
1
投票

由于您不想统计子表,calldata

© www.soinside.com 2019 - 2024. All rights reserved.