您现在的位置是:网站首页> 编程资料编程资料
sql server把退款总金额拆分到尽量少的多个订单中详解_MsSql_
2023-05-26
442人已围观
简介 sql server把退款总金额拆分到尽量少的多个订单中详解_MsSql_
一、问题
原来有三个充值订单,现在要退款450元,如何分配才能让本次退款涉及的充值订单数量最少?具体数据参考下图:

二、解决方案
Step 1:对可退金额进行降序排列,以便优先使用可退金额比较大的订单
Step 2:使用CTE公用表达式,实现类似for或while循环或游标的功能
三、脚本
create table #t ( 充值 int, 已退 int, 可退 int ) insert into #t(充值, 已退, 可退) values (200, 100, 100), (500, 200, 300), (300, 100, 200) /* 作者:zhang502219048 脚本来源:https://www.cnblogs.com/zhang502219048/p/14127208.html */ declare @i要退 int = 450; with cte1 as ( select *, row_number() over(order by 可退 desc) rn, 0 可发起退款, 0 待退 from #t ), cte2 as ( select rn, 充值, 已退, 可退, 可发起退款 = case when @i要退 > 可退 then 可退 else @i要退 end, 待退 = @i要退 - case when @i要退 > 可退 then 可退 else @i要退 end -- 待退 = 要退 - 可发起退款 from cte1 where rn = 1 union all select t2.rn, t2.充值, t2.已退, t2.可退, 可发起退款 = case when t1.待退 > t2.可退 then t2.可退 else t1.待退 end, 待退 = t1.待退 - case when t1.待退 > t2.可退 then t2.可退 else t1.待退 end from cte1 t2 inner join cte2 t1 on t1.rn = t2.rn - 1 -- t2是t1的下一条记录 --where t2.rn > 1 and t1.待退 > 0 ) select * from cte2 drop table #t
四、脚本运行结果

总结
到此这篇关于sql server把退款总金额拆分到尽量少的多个订单中的文章就介绍到这了,更多相关sql server退款总金额拆分到订单内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
相关内容
- SQLServer设置客户端使用IP地址登录的图文详解_MsSql_
- 浅析SQL Server授予了CREATE TABLE权限但是无法创建表_MsSql_
- SQL Server 批量插入数据的完美解决方案_MsSql_
- SQL server分页的4种方法示例(很全面)_MsSql_
- group by 按某一时间段分组统计并查询(推荐)_MsSql_
- 详解安装sql2012出现错误could not open key...解决办法_MsSql_
- SQL SERVER迁移之更换磁盘文件夹的完整步骤_MsSql_
- 详解GaussDB(DWS) explain分布式执行计划的示例_MsSql_
- 解决sql server保存对象字符串转换成uniqueidentifier失败的问题_MsSql_
- SQL server 自增ID--序号自动增加的字段操作_MsSql_
