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退款总金额拆分到订单内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!


  • 本文相关:
  • 去掉前面的0的sql语句(前导零,零前缀)
  • 深入分析mssql数据库中事务隔离级别和锁机制
  • 获取sqlserver存储过程定义的三种方法
  • sql多表连接查询实例分析(详细图文)
  • sql分页查询几种写法
  • sql 查询分析中使用net命令问题
  • 必须会的sql语句(二) 创建表、修改表结构、删除表
  • sqlserver 系统存储过程 中文说明
  • sqlserver2000 报1053错误(服务没有及时响应或控制请求)的解决方
  • sql server根据分区表名查找所在的文件及文件组实现脚本
  • 为什么SQLServer2008的配置管理器中,SQLServer(M...
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页去掉前面的0的sql语句(前导零,零前缀)深入分析mssql数据库中事务隔离级别和锁机制获取sqlserver存储过程定义的三种方法sql多表连接查询实例分析(详细图文)sql分页查询几种写法sql 查询分析中使用net命令问题必须会的sql语句(二) 创建表、修改表结构、删除表sqlserver 系统存储过程 中文说明sqlserver2000 报1053错误(服务没有及时响应或控制请求)的解决方sql server根据分区表名查找所在的文件及文件组实现脚本sql server 2012 安装图解教程(附sql server数据库入门学习总结microsoft sql server 2012 数据win7系统安装sqlserver2000的详细sql重复记录查询的几种方法sqlserver中distinct的用法(不重sql server错误代码大全及解释(sql-order by 多字段排序(升序、sql将一个表中的数据插入到另一个用sql语句添加删除修改字段、一些关于存储过程的编写的一些体会sql server 数据库索引其索引的小技巧错误22022 sqlserveragent当前未运行的解sql server数据库常用transact-sql脚本(推sqlserver 多表关联时在where语句中慎用tsqlloader怎么使用sql server 性能调优之查询从20秒至2秒的sql substring提取部分字符串sqlserver 支持定位当前页,自定义排序的分sql server update语句的用法详解
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved