如何计算多个订单的核销金额

本文介绍了计算多个订单的核销金额的全部过程,运行数据库环境: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无法解决,需要自己生成一个连续的序号。

结果如下:

以上就是关于计算多个订单的核销金额的全部解题思路,希望对大家的学习有所帮助。

(0)

相关推荐

  • SQL语句计算两个日期之间有多少个工作日的方法

    /* 因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日. 设定是一个星期有5个工作日,从星期一到星期五 说明:   第一个星期的工作日数:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天   末一个星期的工作日数:DATEPART(dw, @enddt),最多5天 计算方法:   如果两个日期处在同一个星期内,直接计算"第一个星期的工作日数"   否则按下面的公式计算     (两个日期间的总天数 - 第一个星期的天数 -

  • 在php和MySql中计算时间差的方法

    最近在研究自己爱围脖的时候就要计算到恋爱天数,这需要php根据每天的日期进行计算,下面就来谈谈实现这种日期计算的几种方法: (1) 如果有数据库就很容易了!若是MSSQL可以使用触发器!用专门计算日期差的函数datediff()便可! 若是MYSQL那就用两个日期字段的差值计算的计算结果保存在另一个数值型字段中!用时调用便可! (2)如果没有数据库,那就得完全用php的时间日期函数! 下面主要说明之: 例:计算1998年5月3日到1999-6-5的天数: 复制代码 代码如下: $startdat

  • 用sql实现18位身份证校验代码分享 身份证校验位计算

    身份证校验码的计算方法 1.将前面的身份证号码17位数分别乘以不同的系数.第i位对应的数为[2^(18-i)]mod11.从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 : 2.将这17位数字和系数相乘的结果相加: 3.用加出来和除以11,看余数是多少?: 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字.其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2: 复制代码 代码如下: with

  • SQL2005CLR函数扩展-深入环比计算的详解

    此类问题还可以延伸到类似进销存的批次计算中,这也要关注其他历史记录来决定当前某条记录的状态. sql语句无法简单实现mdx语句的类似功能,必须得用交叉表关联来对比.这里我们用CLR函数来实现mdx语句的类似语法.在select的时候把得到过的做个缓存就可以了.效率应该可以提高不少. clr的代码如下,编译为TestFun.dll,复制到sql服务器的文件目录下.--------------------------------------------------------------------

  • SQL计算字符串中最大的递增子序列的方法

    求字符串中最大的递增子序列 数据库环境:SQL SERVER 2005 如题,求字符串"abcbklmnodfghijkmer"中最大的递增子序列.这个字符串有点特别, 只由26个小写字母a-z组成. 大概思路如下: 1.将字符串转到一列存储,并生成行号 2.设置一个递增计数器列,默认为1,比较上下行的字符,如果在字典中的顺序是递增, 则计数器加1,否则,计数器置1 3.找出计数器最大的数及对应的行号,根据这2个数截取字符串 思路有了,下面直接贴代码 DECLARE @vtext VA

  • 通过SQLSERVER重启SQLSERVER服务和计算机的方法

    昨天和朋友在网上谈到SQL语句的应用,我朋友的远程服务器出现了无法连接的现象,问题的原因是远程服务器到达了最大连接数,为了实现远程重新启动,从而想到了用SQL语句命令实现这个功能,但是具体的命令格式给忘记了,找了点资料,把方法写在下面, 希望可以给大家一些帮助吧,呵呵 首先在本地计算机--创建重启脚本 复制代码 代码如下: declare @o int,@f int,@t int,@ret int exec sp_oacreate 'scripting.filesystemobject',@o

  • mysql 字符串长度计算实现代码(gb2312+utf8)

    PHP对中文字符串的处理一直困扰于刚刚接触PHP开发的新手程序员.下面简要的剖析一下PHP对中文字符串长度的处理: PHP自带的函数如strlen().mb_strlen()都是通过计算字符串所占字节数来统计字符串长度的,一个英文字符占1字节.例: $enStr = 'Hello,China!'; echo strlen($enStr); // 输出:12 而中文则不然,做中文网站一般会选择两种编码:gbk/gb2312或是utf-8.utf-8能兼容更多的字符,所以受到很多站长的喜爱.gbk与

  • 利用php+mysql来做一个功能强大的在线计算器

    找了很久,发现网上资料很少,于是想自己动手写,慢慢的发现问题多了,自己不怎么通算法,写一个计算式子短点还好,长了就挂了,再长点恐怕就要死机. 有一天做做mysql突然发现原来mysql功能这么强大,可以直接计算字符串...哈哈 这下可就高兴了. 代码还超级简单 就做了一个ajax的计算器 有式子错误提示 还可以时时显示输入的式子 有兴趣的朋友可以看看 更多的功能可以自己去开发 演示地址:http://www.jianlila.com/jsq.php jquer.js自己去下载 jsq1.php

  • SQLSERVER 根据地图经纬度计算距离差示例

    SQL SERVER 根据地图经纬度计算距离的公式 复制代码 代码如下: go --创建经纬度距离计算函数 CREATEFUNCTION [dbo].[fnGetDistance] --LatBegin 开始经度 --LngBegin 开始维度 (@LatBegin REAL, @LngBegin REAL, @LatEnd REAL, @LngEnd REAL) RETURNSFLOAT AS BEGIN --距离(千米) DECLARE @Distance REAL DECLARE @EAR

  • 如何计算多个订单的核销金额

    本文介绍了计算多个订单的核销金额的全部过程,运行数据库环境: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 IN

  • ASP.NET Core 2.0 使用支付宝PC网站支付实现代码

    前言 最近在使用ASP.NET Core来进行开发,刚好有个接入支付宝支付的需求,百度了一下没找到相关的资料,看了官方的SDK以及Demo都还是.NET Framework的,所以就先根据官方SDK的源码,用.NET Standard 2.0 实现了支付宝服务端SDK,Alipay.AopSdk.Core(github:https://github.com/stulzq/Alipay.AopSdk.Core) ,支持.NET CORE 2.0.为了使用方便,已上传至Nuget可以直接使用. 支付

  • asp.net 支付宝及时到帐接口使用详解

    其实支付宝公司已经给我们做的很好了, 只要少量的改动就OK了,只是有的程序员不太明天他们的动作流程而以,我就以及时到帐为例子来说了,呵呵 在这之前就大家先下载一下c#版的及时到帐代码    这里是下载地址http://dev.alipay.com/devclub/mvnforum/viewthread_thread,4;jsessionid=595DB7442AAA5CD2FC849E7C2FBE51D7 先看一下程序的结构吧 支付宝有一个类文件叫  AliPay 是一些加密算法之类的东西,包括

  • asp.net B2B网站对接支付宝接口

    大型网上购物系统除了能让会员选择货到付款结账方式外,还应该提供一些更方便快捷的网上支付方式.如果网上商店没有足够的实力提供会员直接在网站中建立现金账户的功能,就可以将订单信息转接到支付宝,让会员从支付宝付款.当然就算会员可以在网站上建立自己的现金账户,提供支付宝支付功能也不失为另一种方便快捷的支付方式,这可以给客户提供更多可选的支付方式. 首先,网上购物系统必须与支付宝公司签订合作协议,以确保从本购物网站上传到 支付宝网站上的订单信息能被正确接收. 当会员于购物网站上买下一系列商品并选择支付宝付

  • 使用php实现快钱支付功能(涉及到接口)

    本项目用zend framework框架实现的modules/default/controllers/IndexController.phpIndexController.php 复制代码 代码如下: <?phpclass IndexController extends Zend_Controller_Action{    public function init()    {        /* Initialize action controller here */    }    publ

  • Spring使用支付宝扫码支付

    前一段一直在研究支付宝的扫码支付,不得不说,支付宝的文档写的真是一个烂(起码在下刚开始看的时候是mengbi的).文档上面的示例和demo里面的示例长的完全不一样.往往文档上面的例子很简单,而demo的代码写的很复杂,所以一开始就不知道该采用哪个代码,后来仔细看了一下demo的那些包里面的代码,发现也是调用的文档示例的那些接口,这才明白它们原来是一个东西,只不过demo对文档的接口进行了一些包装而已. 首先申请一个企业的支付宝账号,这个账号有个pid,需要向这个账号里面添加应用,每个应用都有一个

  • 微信支付仅能成功调用一次问题的解决方法(Android)

    本人使用Android开发有一段时间了,但是本身没有系统学,而且多年专注服务端开发,总觉得因为项目需要接触Android移动端开发只是暂时的,所以没有太上心,结果碰到一个大难题折腾了一天,最后被有经验的小伙伴提示了一下才迎刃而解,感觉无地自容的同时,又非常窃喜,毕竟跨过一个一个的坎,就成长了,在这里丢人等换个地方就成牛了也未可知,哈哈.闲言就絮叨到这里,赶紧分享: 微信支付调用接口整体的流程有必要简述一下(目前网上的资料大部分都是适配微信支付旧版的代码,最新的微信支付官方文档中并没有服务端的De

  • 实例学习SQL的Select命令

    -1.查找员工的编号.姓名.部门和出生日期,如果出生日期为空值, --显示日期不详,并按部门排序输出,日期格式为yyyy-mm-dd. select emp_no ,emp_name ,dept , isnull(convert(char(10),birthday,120),'日期不详') birthday from employee order by dept --2.查找与喻自强在同一个单位的员工姓名.性别.部门和职称 select emp_no,emp_name,dept,title fr

  • 微信扫码支付零云插件版实例详解

    微信扫码支付零云插件版实例详解 微信的扫码支付主要有以下过程: 向微信统一下单地址发送详细的订单信息,微信返回json数据,里面包含生成二维码的字段,使用生成二维码的插件qrcode生成二维码返回给前端,让用户扫码完成支付,然后页面跳转到return_url告知用户支付成功,微信服务器正式通知支付成功之后修改数据库数据. //Pay类下的主要方法 public function buildRequestForm($pay_data){ $UNIFIED_ORDER_URL = 'weixin:/

  • 使用Nopcommerce为商城添加满XX减XX优惠券功能

    公司的电商网站要做个优惠券的功能,nop框架,但我接触nop时间不多,最后还是为了功能而完成了.这中间肯定有很多小问题. Nopcommerce自带的促销功能感觉不是很好,首先优惠券功能放在购物车页面的,如果直接下单就用不了优惠.其次nop的优惠还必须要输入优惠券码很麻烦,最后不满足现在电商主流的单笔订单满XX减XX优惠券功能.但是nop提供了很多基础的方法,我们只要稍作更改就可以达到我们想要的. 优惠券首先需要和用户挂钩,用户可以领取和查看自己的优惠券.优惠券的功能nop基本已经实现了,但是没

随机推荐