初めての投稿ですが、10年以上読者です。借り換え/追加ローンの借り入れによるローリングバランスに関係なく、ローンがいつ返済されたかを示す必要があります。
もう1つの列では、LOAN_ID 215の残高がゼロになるまで、950.00、850.00、800.00、720.00のような支払い残高を表示します。その後、残りの支払いをLOAN_ID431に適用します。
SQL Server2005/2008を使用しています。
これが私のテーブルです:
CUST_ID LOAN_ID PMNT_ID PMNT_AMT PMNT_DT LOAN_AMT LOAN_FUND_DT PMNT_RUN_TOT
1155 215 100 100.00 02/15/2015 1050.00 01/15/2015 100.00
1155 215 101 100.00 03/15/2015 1050.00 01/15/2015 200.00
1155 215 102 50.00 03/31/2015 1050.00 01/15/2015 250.00
1155 215 103 90.00 04/15/2015 1050.00 01/15/2015 340.00
1155 215 104 150.00 04/25/2015 1050.00 01/15/2015 490.00
1155 215 105 120.00 05/15/2015 1050.00 01/15/2015 610.00
1155 431 106 100.00 05/25/2015 2100.00 05/20/2015 710.00
1155 431 107 100.00 06/15/2015 2100.00 05/20/2015 810.00
1155 431 108 100.00 06/30/2015 2100.00 05/20/2015 910.00
1155 431 109 100.00 07/15/2015 2100.00 05/20/2015 1010.00
1155 431 110 100.00 08/15/2015 2100.00 05/20/2015 1110.00
1155 431 111 100.00 09/15/2015 2100.00 05/20/2015 1210.00
1155 431 112 100.00 09/30/2015 2100.00 05/20/2015 1310.00
1155 431 113 100.00 10/15/2015 2100.00 05/20/2015 1410.00
最初のローンはPMNT_ID 110
で返済され、60.00は2100.00ローンの返済に繰り越されました。出力は次のようになります
1155 | 215 | 1050 | 0.00 | 2015-08-15 1155 | 431 | 2100 | 1800.00 | null
「Bal_Pay_Down」と呼ばれる別の列にこれを表示する方法に関する提案はありますか?
この問題を解決するために、私は次のことを行いました(ところで、質問の+ 1-それは興味深い挑戦であり、それを通して多くのことを学びました)。
私はこれを行うためにPostgreSQLを使用しました-SQLサーバーインスタンスを実行していませんが、原則は同じである必要があります。また、次の質問(10年後?)にDDLとDMLがあると便利かもしれません:-)
テーブルを作成しました:
CREATE TABLE payment (CUST_ID int, LOAN_ID int, PMNT_ID int, PMNT_AMT float, PMNT_DT date, LOAN_AMT float, LOAN_FUND_DT date, PMNT_RUN_TOT int);
テーブルに入力:
INSERT INTO payment VALUES (1155, 215, 100, 100.00, '2015-02-15', 300.00, '2015-01-15' , 100.00);
INSERT INTO payment VALUES (1155, 215, 101, 50.00, '2015-03-15', 300.00, '2015-01-15' , 150.00);
INSERT INTO payment VALUES (1155, 215, 102, 75.00, '2015-04-15', 300.00, '2015-01-15' , 225.00);
INSERT INTO payment VALUES (1155, 215, 103, 75.00, '2015-05-15', 300.00, '2015-01-15' , 300.00);
INSERT INTO payment VALUES (1156, 223, 104, 30.00, '2015-02-15', 390.00, '2015-01-15' , 30.00);
INSERT INTO payment VALUES (1156, 223, 105, 30.00, '2015-03-15', 390.00, '2015-01-15' , 60.00);
INSERT INTO payment VALUES (1156, 223, 106, 300.00, '2015-04-15', 390.00, '2015-01-15' , 360.00);
INSERT INTO payment VALUES (1156, 223, 107, 30.00, '2015-07-27', 390.00, '2015-01-15' , 390.00);
次に、次のクエリを実行しました(PARTITION BY
sでの過剰な実行/繰り返しについて心配する必要はありません。ウィンドウ関数を理解しようとしていました)。
WITH tab1 AS
(
SELECT n.cust_id, n.loan_id, n.pmnt_id, pmnt_dt, pmnt_amt,
SUM(n.pmnt_amt) OVER (PARTITION BY n.cust_id, n.loan_id) AS loans,
SUM(n.pmnt_amt) OVER (PARTITION BY n.pmnt_id) AS payments,
SUM(n.pmnt_amt) OVER () AS grand_total,
SUM(n.pmnt_amt) OVER (partition by loan_id ORDER BY pmnt_id) AS payment_per_loan,
SUM(n.pmnt_amt) OVER (ORDER BY loan_id) AS loans_cumulative,
SUM(n.pmnt_amt) OVER (PARTITION BY n.loan_id) loan_amount,
(SUM(n.pmnt_amt) OVER (PARTITION BY n.cust_id, n.loan_id)) -
(SUM(n.pmnt_amt) OVER (partition by loan_id ORDER BY pmnt_id)) AS remainder_per_loan
FROM payment AS n
ORDER BY cust_id, n.loan_id, n.pmnt_id, n.pmnt_dt
)
SELECT cust_id, loan_id, loan_amount, pmnt_dt AS paid_off_date FROM tab1
WHERE remainder_per_loan = 0
そしてその結果は(私が使用したデータの限られたサブセットで):
cust_id|loan_id|loan_amount|paid_off_date
----------------------------------------------------
1155| 215| 300| 2015-05-15
1156| 223| 390| 2015-07-27