1. ホーム
  2. データベース
  3. mssql2005

複数注文の場合の償却額の計算方法について

2022-01-09 10:07:19

この記事では、複数の注文の償却額を計算するための全体の流れを説明し、実行します。 データベース環境。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 - the amount of all orders prior to this order
        FROM #t t1
       ),/* Calculate the write-off amount*/
    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
       )
   /* If the write-off amount is negative, change it to 0*/
  SELECT id AS serial number,
      dingdan order,
      sale order amount,
      CASE WHEN new_sale < 0 THEN 0
         ELSE new_sale
      END AS write off amount
  FROM x2

解析関数で解決できないので、スカラーサブクエリで同じ効果を得るしかない。もちろん、提供されるデータには、以下のような制限があります。

序数が連続していない場合、私のSQLを直接適用しても問題は解決せず、自分で連続した序数を生成する必要があります。

その結果は次のようになります。

以上が、複数注文の場合の償却額計算の解答です。