日期:2014-05-16  浏览次数:20803 次

oacale中用sun()函数产生的误差该如何解决??
我在写完sql运行完后发现在比率在三列中有明显的误差,
sql如下
select qu.AREANAME,count(distinct(dt.ELEVID)),nvl(sum(sg.kr),0),nvl(sum(sg.kr)/count
       (dt.ELEVID),0),nvl(sum(sg.gz),0),nvl(sum(sg.gz)/count(dt.ELEVID),0),nvl(sum(sg.zl),0),
       nvl(sum(sg.zl)/count(dt.ELEVID),0) 
               from (select CREATETIME, sum(case when urgentstatus=1 or urgentstatus=2 then 1 else 0 end) kr,
                    sum(case when urgentstatus=0 or urgentstatus=3 then 1 else 0 end) gz,
                    count(0) zl,ELEVATORID from elev_accident 
                     where to_char(createtime,'yyyy-mm')= '2013-04'
                    group by ELEVATORID,CREATETIME
                    ) sg 
                      right join ELEV_ELEVATORINFO dt on dt.ELEVID= sg.ELEVATORID
                      right join ELEV_AREA qu on qu.AREACODE=dt.AREACODE
                           where dt.state=1 AND to_char(dt.createtime,'yyyy-mm')<='2013-04'
                                group by qu.AREANAME
                                    order by nvl(sum(sg.zl)/count(dt.ELEVID),0) desc

运行结果如下[img=http://][/img]

无奈啊,图片插不进来,那就有吧问题说一下吧,nvl(sum(sg.kr)/count(dt.ELEVID),0),nvl(sum(sg.gz)/count(dt.ELEVID),0),nvl(sum(sg.zl)/count(dt.ELEVID),0) 所的出来的数据有错误,但是kr,gz,zl,和count(dt.elevid)没有错误,求解
orale?sum求值误差

------解决方案--------------------
很明显,nvl(sum(sg.kr), 0), nvl(sum(sg.gz), 0),nvl(sum(sg.zl), 0),count(distinct(dt.ELEVID)),这几个都是针对单个表,数据肯定是准确的。
nvl(sum(sg.kr)/count(dt.ELEVID),0),nvl(sum(sg.gz)/count(dt.ELEVID),0),nvl(sum(sg.zl)/count(dt.ELEVID),0) 这几个都是跨表取字段,sg是左表,dt是右表,而你采用的是右外连接,所以有这样的情况:右表存在的数据,在左表中不存在,这样以来,数据自然不准确了。