如何计算多个订单的核销金额
作者:Boss_he 发布时间:2024-01-26 17:56:31
标签:SQL2005,计算核销金额
本文介绍了计算多个订单的核销金额的全部过程,运行数据库环境:SQL SERVER 2005,下面跟大家分享一下。
下图是一张订单明细表,现有金额要1700,根据订单单号的顺序依次对订单金额进行核销。
到支付订单6时,支付金额不足,只能支付200,后面订单的核销金额为0。
1.基础数据准备
CREATE TABLE #t
( id INT ,
dingdan VARCHAR(20),
sale MONEY
)
INSERT INTO #t VALUES (1,'a',100);
INSERT INTO #t VALUES (2,'b',200);
INSERT INTO #t VALUES (3,'c',300);
INSERT INTO #t VALUES (4,'d',400);
INSERT INTO #t VALUES (5,'e',500);
INSERT INTO #t VALUES (6,'f',600);
INSERT INTO #t VALUES (7,'g',700);
INSERT INTO #t VALUES (8,'h',800);
INSERT INTO #t VALUES (9,'i',900);
INSERT INTO #t VALUES (10,'j',1000);
解题思路如下:
先计算出在每个订单之前总共要核销的金额数,然后加上本次将要核销的订单金额,跟1700比较,
如果总和小于等于1700,那么,这个订单的订单金额可以全部核销,否则,只能核销部分,
即1700-本订单之前的所有订单金额之和。
;WITH x1
AS ( SELECT t1.id ,
t1.dingdan ,
t1.sale ,
( SELECT ISNULL(SUM(t2.sale), 0)
FROM #t t2
WHERE t2.id < t1.id
) AS curr_sale_sum--本订单之前的所有订单金额
FROM #t t1
),/*计算出核销金额*/
x2
AS ( SELECT id ,
dingdan ,
sale ,
CASE WHEN curr_sale_sum + sale <= 1700 THEN sale
ELSE 1700 - curr_sale_sum
END AS new_sale
FROM x1
)
/*核销金额为负数,则变更为0*/
SELECT id AS 序号,
dingdan 订单,
sale 订单金额,
CASE WHEN new_sale < 0 THEN 0
ELSE new_sale
END AS 核销金额
FROM x2
由于不能用分析函数来解题,只好用标量子查询实现相同的效果。当然,提供的数据有一定的局限性,
如果序号不是连续的,直接套用我的SQL无法解决,需要自己生成一个连续的序号。
结果如下:


猜你喜欢
- 一个封装好的JavaScript拖动类,使用方便:<div id="idDrag" style="bor
- 最近重温了一下位图分割的相关内容,发现网络上位图分割原理讲得已经很清楚了,但是代码多为C++实现或者Matlab实现,因为需要Python的
- Navicat数据存放位置和备份数据库路径设置navicat的数据库存放位置在什么地方?带着这样的疑问,我们去解决问题,navicat是默认
- 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能。回忆一下Animal类层次的设计,假设我们要实现以下4种动物:&
- 介绍本文中探索三个流行的 Python 图像增强库。图像分类器通常在训练更多的图像时表现得更好。在图像分类模型中,一个常见的问题是,模型不能
- 1. ADO.NET 方式连接Mysql数据库 经过在网上查找资料,在.net 上连接mysql 数据库有三种方式: 方法一: 使用Core
- 由于工作需要,在做最优分箱的时候,始终写不出来高效的代码,所以就找到了R语言中的最优分箱的包,这个时候考虑到了在python中调用R语言,完
- 一、Mysql分区类型1、RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。2、HASH分区:基于用户定义的表达式的返回值
- 本教程为大家分享了mysql5.7.17安装配置方法,供大家参考,具体内容如下操作 全允许精彩专题分享:mysql不同版本安装教程 mysq
- 近期遇到一个需求,就是用PySide2做出一个GUI,并且要将后台使用Matplotlib绘制的图显示在界面上。自己琢磨了蛮久,网上也搜了不
- 导入Git项目 新建项目File–>New–>Project from Version Control–>Git从Git
- BN与Dropout共同使用出现的问题BN和Dropout单独使用都能减少过拟合并加速训练速度,但如果一起使用的话并不会产生1+1>2
- 修改vue-treeSelect的高度.vue-treeselect{ height: 28px; }
- 在 Python 中是没有原生数据类型支持时间的,日期与时间的操作需要借助三个模块,分别是 time、datetime、calendar。t
- 回滚段管理一直是ORACLE数据库管理的一个难题,本文通过实例介绍ORACLE回滚段的概念,用法和规划及问题的解决。 回滚段概述 回滚段用于
- 窗口背景主要包括,背景色与背景图片,设置窗口背景有三种方法使用QSS设置窗口背景使用QPalette设置窗口背景实现PainEvent,使用
- 本文学习如何在Golang程序中执行Shell命令(如,ls,mkdir或grep),如何通过stdin和stdout传入I/O给正在运行的
- sql server中变量要先申明后赋值:局部变量用一个@标识,全局变量用两个@(常用的全局变量一般都是已经定义好的);申明局部变量语法:d
- 在开发过程中,收到这样一个问题反馈,在网站上传 100 MB 以上的文件经常失败,重试也要等老半天,这就难为需要上传大规格文件的用户了。那么
- 1 什么是嵌套循环所谓嵌套循环就是一个外循环的主体部分是一个内循环。内循环或外循环可以是任何类型,例如 while 循环或 for 循环。