2016-04-12 15 views
0

私のデータベースからクリッピングするテーブルは次のとおりです。私には2種類の契約があります。テーブルにステータスを追加するには

I:クライアントが最初6mth 60 $、次の6mth 120 $(111クライアント)

IIを支払う:クライアントが最初6mth 60 $を支払うが、まだ契約が6mthで拡張されます$ 60を支払う必要がある場合は、全体の契約は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 - 契約が終了し

L - - 契約が6mth後で12mth後に倍になるE(agreemntのND)

Eであります6mth後の契約は、ステータスがタイプE

契約のな長さが18

に12から更新された12mth後321クライアントの場合となります18mth後、延長されました

私はたくさんのクライアントを持っているので、すべてのクライアントが行くためにループを使う方が良いと思いますか?

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

@モーター:前の列に依存します。逆カウントは最初の値から開始されます。たとえば、6分後に2倍の金額を持つクライアントと区別しないクライアントを区別する方法を知っていますか?その量は、例えば、 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; 
関連する問題