mysql计算订单总金额_sql server把退款总金额拆分到尽量少的多个订单中详解

该博客介绍了一个SQL Server脚本,用于解决如何将450元退款分配到充值订单中,使得涉及退款的订单数量最少。通过降序排列可退金额并使用CTE公用表达式模拟循环,脚本能动态分配退款,直到总额达到450元。这种方法有助于优化退款操作,减少处理订单的工作量。
摘要由CSDN通过智能技术生成

一、问题

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

4999d9c624f46b5369a39d4cb27d2d16.png

二、解决方案

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

四、脚本运行结果

5d5f4775b122a03d43b415fbf8afba0a.png

总结

到此这篇关于sql server把退款总金额拆分到尽量少的多个订单中的文章就介绍到这了,更多相关sql server退款总金额拆分到订单内容请搜索WEB开发者以前的文章或继续浏览下面的相关文章希望大家以后多多支持WEB开发者!

暂无相关信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值