2016-04-12 31 views
0

我有下表,其中是從我的數據庫剪輯。我有兩種類型的合同。如何添加狀態到表

我:客戶支付第一6mth $ 60,下一6mth 120 $(111客戶端)

二:客戶支付第一6mth $ 60,但如果想還是支付$ 60的合同將在6mth延長,整個合同是18個月。 (321客戶仍然支付)

ID_Client | Amount | Amount_charge | Lenght | Date_from | Date_to | Reverse 
-------------------------------------------------------------------------------- 
111   60   60   12  2015-01-01 2015-01-31 12 
111   60   60   12  2015-02-01 2015-02-28 11 
111   60   60   12  2015-03-01 2015-03-31 10 
111   60   60   12  2015-04-01 2015-04-30 9 
111   60   60   12  2015-05-01 2015-05-31 8 
111   60   60   12  2015-06-01 2015-06-30 7 
111   120  60   12  2015-07-01 2015-07-31 6 
111   120  60   12  2015-08-01 2015-08-31 5 
111   120  60   12  2015-09-01 2015-09-30 4 
111   120  60   12  2015-10-01 2015-10-31 3 
111   120  60   12  2015-11-01 2015-11-30 2 
111   120  60   12  2015-12-01 2015-12-31 1 
111   120  60   12  2016-01-01 2015-01-31 0 
111   120  60   12  2016-02-01 2015-02-29 0 
321   60   60   12  2015-01-01 2015-01-31 12 
321   60   60   12  2015-02-01 2015-02-28 11 
321   60   60   12  2015-03-01 2015-03-31 10 
321   60   60   12  2015-04-01 2015-04-30 9 
321   60   60   12  2015-05-01 2015-05-31 8 
321   60   60   12  2015-06-01 2015-06-30 7 
321   60   60   12  2015-07-01 2015-07-31 6 
321   60   60   12  2015-08-01 2015-08-31 5 
321   60   60   12  2015-09-01 2015-09-30 4 
321   60   60   12  2015-10-01 2015-10-31 3 
321   60   60   12  2015-11-01 2015-11-30 2 
321   60   60   12  2015-12-01 2015-12-31 1 
321   60   60   12  2016-01-01 2016-01-30 0 
321   60   60   12  2016-02-01 2016-02-31 0 
321   60   60   12  2016-03-01 2016-03-30 0 
321   60   60   12  2016-04-01 2016-04-31 0 

我需要添加狀態列。

A - 協議的正常週期

d - ,其中該協議6mth後增加了一倍,但12mth後是E(agreemnt的ND)

ë - ,其中合同完成

L - 其中6mth後合同被延長,18mth後的狀態將是E型

對於321客戶端12mth後合同lenght從12更新爲18

我有很多客戶,所以我認爲更好的將使用循環去所有的客戶?

ID_Client | Amount | Amount_charge | Lenght | Date_from | Date_to | Reverse | Status 
----------------------------------------------------------------------------------------- 
111   60   60   12  2015-01-01 2015-01-31 12   A 
111   60   60   12  2015-02-01 2015-02-28 11   A 
111   60   60   12  2015-03-01 2015-03-31 10   A 
111   60   60   12  2015-04-01 2015-04-30 9   A 
111   60   60   12  2015-05-01 2015-05-31 8   A 
111   60   60   12  2015-06-01 2015-06-30 7   A 
111   120  60   12  2015-07-01 2015-07-31 6   D 
111   120  60   12  2015-08-01 2015-08-31 5   D 
111   120  60   12  2015-09-01 2015-09-30 4   D 
111   120  60   12  2015-10-01 2015-10-31 3   D 
111   120  60   12  2015-11-01 2015-11-30 2   D 
111   120  60   12  2015-12-01 2015-12-31 1   D 
111   120  60   12  2016-01-01 2015-01-31 0   E 
111   120  60   12  2016-02-01 2015-02-29 0   E 
321   60   60   12  2015-01-01 2015-01-31 12   A 
321   60   60   12  2015-02-01 2015-02-28 11   A 
321   60   60   12  2015-03-01 2015-03-31 10   A 
321   60   60   12  2015-04-01 2015-04-30 9   A 
321   60   60   12  2015-05-01 2015-05-31 8   A 
321   60   60   12  2015-06-01 2015-06-30 7   A 
321   60   60   12  2015-07-01 2015-07-31 6   L 
321   60   60   12  2015-08-01 2015-08-31 5   L 
321   60   60   12  2015-09-01 2015-09-30 4   L 
321   60   60   12  2015-10-01 2015-10-31 3   L 
321   60   60   12  2015-11-01 2015-11-30 2   L 
321   60   60   12  2015-12-01 2015-12-31 1   L 
321   60   60   18  2016-01-01 2016-01-30 0   L 
321   60   60   18  2016-02-01 2016-02-31 0   L 
321   60   60   18  2016-03-01 2016-03-30 0   L 
321   60   60   18  2016-04-01 2016-04-31 0   L 
+0

什麼是反向。 Reverse總是以12開頭,不能<0?只有60美元和120美元的礦石還有其他的美元? – Mottor

+0

@Mottor:反向依賴於Lenght列。反向計數從Lenght的第一個值開始。你知道如何區分例如6個月後有或沒有加倍金額的客戶嗎?該量可以是各種例如20美元,30美元,50美元等等。 – Merix

+0

你有沒有看到答案。如果您不想比較總和,則可以使用分析函數ROW_NUMBER()OVER(... – Mottor

回答

0

如果反向列是什麼,我認爲:

update table1 a 
set "Status"= 
    CASE 
     WHEN A."Reverse" > 6 THEN 
     'A' 
     WHEN A."Reverse" > 0 THEN 
     DECODE (A."Amount", A."Amount_charge", 'L', 'D') 
     ELSE 
     CASE 
      WHEN A."Amount" <> A."Amount_charge" THEN 
       'E' 
      ELSE 
       CASE WHEN ADD_MONTHS ((SELECT b."Date_from" FROM table1 b WHERE a."ID_Client" = b."ID_Client" AND b."Reverse" = 1),6) > a."Date_from" THEN 'L' 
        ELSE 
        'E' 
       END 
     END 
    END 

更好的是計算的款項。每月的金額來自首次付款。像這樣:

DECLARE 
    CURSOR c2 
    IS 
      SELECT ID_CLIENT, --AMOUNT, AMOUNT_CHARGE, LENGTH, DATE_FROM, DATE_TO, REVERSE, STATUS, 
       FIRST_VALUE (amount_charge) OVER (PARTITION BY id_client ORDER BY date_from) first_amount_charge, 
       SUM (amount) OVER (PARTITION BY id_client ORDER BY date_from) sum_amount, 
       SUM (amount_charge) OVER (PARTITION BY id_client ORDER BY date_from) sum_amount_charge 
      FROM TABLE2 
     FOR UPDATE NOWAIT; 
BEGIN 
    FOR c1 IN c2 
    LOOP 
     UPDATE table2 
     SET status = CASE WHEN c1.sum_amount <= 6 * c1.first_amount_charge THEN 'A' 
          WHEN c1.sum_amount > 18 * c1.first_amount_charge THEN 'E' 
          WHEN c1.sum_amount > c1.sum_amount_charge THEN 'D' 
          ELSE 'L' 
         END 
     WHERE CURRENT OF c2; 
    END LOOP; 
END;