目前有问题sql:
select a.org_no,a.percent,round(5000*a.percent/100,0) from a;
a表记录如下
org_no   percent
001       33.33
002       22.22
003       ...合计      100
所有percent加起来等于100,但是使用sql查询,按照百分比分配数字时候出现四舍五入,例如把5000按照百分比分配给所有部门。最终和并不等于5000,是5001或者5002或者4999,请教高手sql该怎么写sql思路我觉得是按照百分比分配,最后一个部门使用5000减去以上所有部门的和。但是sql写不出。

解决方案 »

  1.   


    select round(2.55,1) c1
    from dual     c1
    ---------------
    1 2.6
      

  2.   

    a表记录如下
    org_no percent
    001 13.48
    002 14.57
    003 25.66
    004 17.77
    005 12.34
    006 16.18合计 100,也就是一共100%。说明白点,就是把一个数字按照各个部门所占的百分比分配下去,现在由于误差,各个部门分配后的数字相加和总数有误差。
      

  3.   

    如果直接四舍五入肯定会出问题咯  5000percent% 里面尾数只有0和5 出现0还好  但是出现5呢 直接入了 等于是percent有2个尾数为单 总体就会多1  4个为单 总体多2
      

  4.   

    我是说怎么解决。sql应该怎么写。
      

  5.   


    with a as
    (
        select '001' as org_no,13.48 as percent from  dual union all
        select '002',14.57 from dual union all
        select '003',25.66 from dual union all
        select '004',17.77 from dual union all
        select '005',12.34 from dual union all
        select '006',16.18 from dual
    ),
    cte2 as
    (
        select org_no,
               percent,
               round(5000*(a.percent/100.0),3) as v_sum   --Round(...,5) 多保留几位小数
        from a
    ) select sum(v_sum) from cte2;
      

  6.   


    with a as
    (
        select '001' as org_no,13.48 as percent from  dual union all
        select '002',14.57 from dual union all
        select '003',25.66 from dual union all
        select '004',17.77 from dual union all
        select '005',12.34 from dual union all
        select '006',16.18 from dual
    )
    select a.org_no,
           a.percent,
           round(
           5000*(a.percent/100.0)
           ,0)-NVL(b.v_sum,5000)+5000 as v_sum   
    from a
    left join 
    (
        --汇总金额,把他分摊到最后一个
        with cte as
        (
        select a.org_no,
               sum(round(5000*(a.percent/100.0),0)) over() as v_sum 
        from a 
        ) select * from cte where rownum=1
    )b on a.org_no=b.org_no
    /*
    ORG_NO PERCENT V_SUM
    001 13.48 673
    004 17.77 889
    006 16.18 809
    003 25.66 1283
    005 12.34 617
    002 14.57 729
    */
      

  7.   

     跟sql无关 
    完全是个数学问题。先四舍五入在求和,先求和再四舍五入。结果肯定不一样。提高四舍五入的精度和结果精度的差。
      

  8.   

     跟sql无关 
    完全是个数学问题。先四舍五入在求和,先求和再四舍五入。结果肯定不一样。提高四舍五入的精度和结果精度的差。
      

  9.   

    看看,最近在学习Oracle,发现过程的写法跟sqlserver大不一样..