BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #11005同步于 2018/7/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖

【问题】oracle数据库存储过程300元有偿请教,标题尽量长~~~~~~

cc644525656
2018/7/18镜像同步5 回复
问题描述: Oracle数据库环境下,用sql存储过程解决。 现有表TCONFIRMDETAILTEMP。其中,REQUESTNO(申请单编号)可以视为每条记录的独一无二的主键,若干条记录可以有相同的TOTALREQUESTNO(汇总申请单编号),具有相同汇总申请单编号的记录,他们各自的申请金额字段为BALANCE。BALANCETOTAL表示的是汇总的申请金额,通过将具有相同TOTALREQUESTNO记录中的BALANCE累加得到。FARETOTAL表示的是汇总手续费,现在要做的是将汇总手续费拆分到每个记录中,用FARE表示。 例如有四条记录对应A、B、C、D四个客户,这四条记录正好对应同一个汇总申请单编号TOTALREQUESTNO。申请金额BALANCE分别为200,、300、300、500,即BALANCETOTAL为1300。现在汇总手续费给定为1422.57,则A手续费拆分为1422.57*200/1300=218.8569(单纯截取小数点2位,不四舍五入,使用了trunc函数),即218.85,类似的B、C、D手续费为328.28、328.28、547.14。这是第一环节比例拆分。 因为是截取所以存在尾差,将四者加起来之和为218.85+328.28+328.28+547.14=1422.55,即与原本的1422.57存在0.02元的尾差。需要将尾差以0.01元为基本单位分到经过申请金额降序排列后的四个客户记录中,从高到低所以是D、C(B与C都是300,选B也行,如果数额相同无所谓优先顺序,尾差分完为止)。 分配后对应的手续费为 A: 218.85 B: 328.28 C: 328.28+0.01=328.29 D: 547.14+0.01=547.15 即TCONFIRMDETAILTEMP表中,REQUESTNO、TOTALREQUESTNO、BALANCE、BALANCETOTAL、FARETOTAL均有数据。目前第一环节比例拆分FARE也已完成,尾差暂未处理。如有需要,可以在TCONFIRMDETAILTEMP中添加列。 Sql不是很熟悉卡住了,而且明天参加培训没有时间写了。 看着描述很长,只是尽量想说清楚。逻辑不复杂,想请校友们帮忙下。能解决问题的话,300元报酬吧。论坛老ID了,还是有信誉度的,诚心请教。多谢~ 有意者直接短信、微信联系,一八21八一八2五八6,如果对金融IT找工作有兴趣的也可以交流,版主手下留情哈。
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
cc644525656机器人#1 · 2018/7/18
申请单编号定义是varchar2(20),其他涉及金额的都是number(16,2)
xcxd机器人#2 · 2018/7/18
bd
byby2012机器人#3 · 2018/7/19
编辑好几回都没对齐,sql语句应该可以直接查询出来,如果要更新原表再和查询出来的结果关联更新 select requestno,totalrequestno,balance,balancetotal,faretotal, (case when rn<=n then fare_1+0.01 else fare_1 end)as fare --最终手术费 from( select requestno,totalrequestno,balance,balancetotal,faretotal,fare_1,rn (faretotal-sum(fare_1) over(partition by totalrequestno))/0.01 as n,--尾差平分给这么多个人 from( select requestno,totalrequestno,balance,balancetotal,faretotal, trunc(balance*faretotal/balancetotal,2) as fare_1 --第一阶段的手术费 row_number() over(partition by totalrequestno order by balance desc) as rn from tconfirmdetailtemp ) t1 )t2
cc644525656机器人#4 · 2018/7/19
万分抱歉!早上有位校友加了微信接任务,然后已经邮件发给我了。不好意思啊,因为没有及时更新帖子给您造成麻烦了! 【 在 byby2012 的大作中提到: 】 : 编辑好几回都没对齐,sql语句应该可以直接查询出来,如果要更新原表再和查询出来的结果关联更新 : select requestno,totalrequestno,balance,balancetotal,faretotal, : (case when rn<=n then fare_1+0.01 else fare_1 end)as fare --最终手术费
byby2012机器人#5 · 2018/7/19
哈哈,没觉得麻烦啊