zoukankan      html  css  js  c++  java
  • 计算多个订单的核销金额

    数据库环境: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);
    View Code

    解题思路如下:

    先计算出在每个订单之前总共要核销的金额数,然后加上本次将要核销的订单金额,跟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
    View Code

    由于不能用分析函数来解题,只好用标量子查询实现相同的效果。当然,提供的数据有一定的局限性,

    如果序号不是连续的,直接套用我的SQL无法解决,需要自己生成一个连续的序号。

    结果如下:

  • 相关阅读:
    软件体系架构复习要点
    Operating System on Raspberry Pi 3b
    2019-2020 ICPC North-Western Russia Regional Contest
    2019 ICPC ShenYang Regional Online Contest
    2019 ICPC XuZhou Regional Online Contest
    2019 ICPC NanChang Regional Online Contest
    2019 ICPC NanJing Regional Online Contest
    Codeforces Edu Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div.1+Div.2)
    AtCoder Beginning Contest 139
  • 原文地址:https://www.cnblogs.com/boss-he/p/4708880.html
Copyright © 2011-2022 走看看