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

 更新时间:2020年12月14日 09:08:27   作者:张工502219048  
这篇文章主要给大家介绍了关于sql server把退款总金额拆分到尽量少的多个订单中的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、问题

原来有三个充值订单,现在要退款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退款总金额拆分到订单内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SQL Server中使用表变量和临时表

    SQL Server中使用表变量和临时表

    这篇文章介绍了SQL Server中使用表变量和临时表的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 详解SQL游标的用法

    详解SQL游标的用法

    这篇文章主要介绍了SQL游标的用法,文中讲解非常详细,配合代码帮助大家更好的理解学习,感兴趣的朋友可以了解下
    2020-06-06
  • sql server的一个有趣的bit位运算分享

    sql server的一个有趣的bit位运算分享

    sql server中没有bool类型,而是用bit类型来表示bool值,估计是为了节省存储空间,下面为大家介绍下这个有趣的bit位运算,感兴趣的朋友可以参考下
    2013-09-09
  • SQL高级应用之同服务器上复制表到另一数据库中并实现去重复

    SQL高级应用之同服务器上复制表到另一数据库中并实现去重复

    项目需求:将数据库Whir_ezMall_Full中的表Whir_Member的数据迁移到数据库Whir_ezMall_Full_c中的Whir_Member表,已存在的ID记录则不插入
    2014-06-06
  • SQL SERVER 数据库备份代码实例

    SQL SERVER 数据库备份代码实例

    这篇文章主要介绍了SQL SERVER数据库备份,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • System表空间不足的报警问题浅析

    System表空间不足的报警问题浅析

    这篇文章主要介绍了System表空间不足的报警问题浅析,需要的朋友可以参考下
    2017-10-10
  • SQL Server在T-SQL语句中使用变量

    SQL Server在T-SQL语句中使用变量

    这篇文章介绍了SQL Server在T-SQL语句中使用变量的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • sql server删除前1000行数据的方法实例

    sql server删除前1000行数据的方法实例

    最近处理数据的时候遇到了个问题,需要利用sql删除表格的前1000行数据,尝试过后这里给大家分享下过程,所以下面这篇文章主要给大家介绍了关于sql server删除前1000行数据的相关资料,需要的朋友可以参考下
    2021-08-08
  • sql时间段切分实现每隔x分钟出一份高速门架车流量

    sql时间段切分实现每隔x分钟出一份高速门架车流量

    本文主要介绍了sql时间段切分实现每隔x分钟出一份高速门架车流量,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • SQL语句执行顺序详解

    SQL语句执行顺序详解

    本文给大家介绍SQL语句执行顺序详解,涉及到sql语句执行顺序相关知识,对sql语句执行顺序感兴趣的朋友一起看看吧
    2015-10-10

最新评论