经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
sql server如何把退款总金额拆分到尽量少的多个订单中
来源:cnblogs  作者:张工502219048  时间:2020/12/14 17:17:21  对本文有异议

一、问题

原来有三个充值订单,现在要退款450元,如何分配才能让本次退款涉及的充值订单数量最少?具体数据参考下图:

二、解决方案

  • Step 1:对可退金额进行降序排列,以便优先使用可退金额比较大的订单
  • Step 2:使用CTE公用表达式,实现类似for或while循环或游标的功能

三、脚本

  1. create table #t
  2. (
  3. 充值 int,
  4. 已退 int,
  5. 可退 int
  6. )
  7. insert into #t(充值, 已退, 可退)
  8. values (200, 100, 100), (500, 200, 300), (300, 100, 200)
  9. /*
  10. 作者:zhang502219048
  11. 脚本来源:https://www.cnblogs.com/zhang502219048/p/14127208.html
  12. */
  13. declare @i要退 int = 450;
  14. with cte1 as
  15. (
  16. select *, row_number() over(order by 可退 desc) rn, 0 可发起退款, 0 待退
  17. from #t
  18. ),
  19. cte2 as
  20. (
  21. select rn, 充值, 已退, 可退,
  22. 可发起退款 = case when @i要退 > 可退 then 可退 else @i要退 end,
  23. 待退 = @i要退 - case when @i要退 > 可退 then 可退 else @i要退 end -- 待退 = 要退 - 可发起退款
  24. from cte1
  25. where rn = 1
  26. union all
  27. select t2.rn, t2.充值, t2.已退, t2.可退,
  28. 可发起退款 = case when t1.待退 > t2.可退 then t2.可退 else t1.待退 end,
  29. 待退 = t1.待退 - case when t1.待退 > t2.可退 then t2.可退 else t1.待退 end
  30. from cte1 t2
  31. inner join cte2 t1 on t1.rn = t2.rn - 1 -- t2t1的下一条记录
  32. --where t2.rn > 1 and t1.待退 > 0
  33. )
  34. select * from cte2
  35. drop table #t

四、脚本运行结果

五、作者声明

欢迎转载,但转载请务必注明博文来源和作者!

原文链接:http://www.cnblogs.com/zhang502219048/p/14127208.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号