一、问题

原来有三个充值订单,现在要退款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如何把退款总金额拆分到尽量少的多个订单中的更多相关文章

  1. (火炬)MS SQL Server数据库案例教程

    (火炬)MS SQL Server数据库案例教程 创建数据库: CREATE DATABASE TDB //数据库名称 ON ( NAME=TDB_dat,//逻辑文件名 在创建数据库完成之后语句中引 ...

  2. sql server 任务调度与CPU

    一. 概述 我们知道在操作系统看来, sql server产品与其它应用程序一样,没有特别对待.但内存,硬盘,cpu又是数据库系统最重要的核心资源,所以在sql server 2005及以后出现了SQ ...

  3. 如何解决 SQL Server 中的锁升级所致的阻塞问题

    概要 锁升级为表锁插入转换很多细粒度的锁 (如行或页锁) 的过程.Microsoft SQL Server 动态确定何时执行锁升级.作出决定之前,SQL Server 将特定的扫描,整个事务,并且用于 ...

  4. 手动为 Team Foundation Server 安装 SQL Server

    本主题中的步骤适用于安装 SQL Server 2012 企业版,你也可以使用安装标准版的相同步骤. 适用于 SQL 2014 的步骤与以上步骤也非常相似. 我们将在 TFS 所在的同一服务器上安装 ...

  5. SQL Server 链接服务器的安全

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 安全设置(Security Settings) 实现效果:用户A能看见能使用,B用户不能看见这 ...

  6. (转)SQL Server 性能调优(cpu)

    摘自:http://www.cnblogs.com/Amaranthus/archive/2012/03/07/2383551.html 研究cpu压力工具 perfom SQL跟踪 性能视图 cpu ...

  7. [转] 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能

    首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET ...

  8. 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能

    首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET ...

  9. SQL Server 内存中OLTP内部机制概述(一)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

随机推荐

  1. Java POI导入word, 带图片

    1.导入文件示例,word中简历表格模板 2.代码示例分两部分,一部分读取图片 /** * 导入word(基本信息,word格式) * @param staffId * @param baseInfo ...

  2. Vue 计算属性与方法

    computed 基本使用 如果数据需要有复杂的计算,则可以在Vue实例中定义计算属性,再交由mustache进行渲染. computed内部其实是通过getttr实现的,所以不用加括号即可完成其下方 ...

  3. 深度学习论文翻译解析(十四):SSD: Single Shot MultiBox Detector

    论文标题:SSD: Single Shot MultiBox Detector 论文作者:Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Sz ...

  4. Service Cloud零基础学习(二)Entitlement & MileStone

    https://trailhead.salesforce.com/content/learn/modules/entitlements 很少会有人不买东西,买的多了也很少没有人没有经历过售后流程.我们 ...

  5. xdebug不显示

  6. Java 枚举 enum 详解

    本文部分摘自 On Java 8 枚举类型 Java5 中添加了一个 enum 关键字,通过 enum 关键字,我们可以将一组拥有具名的值的有限集合创建为一种新的类型,这些具名的值可以作为常规的程序组 ...

  7. 如何使Camtasia的抠像效果更真实自然

    相信大家都知道录像编辑软件Camtasia的"移除颜色"可以抠像换背景,详细操作可以看小编的另一篇教程 <如何用Camtasia为微课换上一个好看的背景>.接下来,小编 ...

  8. 下载器Folx如何实现排队下载功能

    用户在下载多个文件时,当然会希望这些文件都能同时下载,以达到短时间内完成下载任务的目的.但另一方面来说,同时下载过多文件,会分散带宽资源,降低了每个文件的下载速度,从而导致下载时间的延长. 为了实现多 ...

  9. ubuntu安装php的 redis扩展

    wget https://github.com/phpredis/phpredis/archive/2.2.4.tar.gztar -zxvf 2.2.4.tar.gz cd phpredis-2.2 ...

  10. 获取qq头像

    1 <?php 2 header('content-type: image/jpeg'); 3 $QQ = $_GET['qq']; 4 $time2 = date('Y-m-d H:i:s') ...