目前有问题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写不出。
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写不出。
select round(2.55,1) c1
from dual c1
---------------
1 2.6
org_no percent
001 13.48
002 14.57
003 25.66
004 17.77
005 12.34
006 16.18合计 100,也就是一共100%。说明白点,就是把一个数字按照各个部门所占的百分比分配下去,现在由于误差,各个部门分配后的数字相加和总数有误差。
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;
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
*/
完全是个数学问题。先四舍五入在求和,先求和再四舍五入。结果肯定不一样。提高四舍五入的精度和结果精度的差。
完全是个数学问题。先四舍五入在求和,先求和再四舍五入。结果肯定不一样。提高四舍五入的精度和结果精度的差。