2016-04-12 4 views
0

У меня есть следующая таблица, где вырезается из моего db. У меня есть два типа контрактов.Как добавить статус в таблицу

I: клиент платит за первый 6мес 60 $, следующая 6мес 120 $ (111 клиентов)

II: клиент платит за первые 6мес 60 $, но если хотите, по-прежнему платит 60 $ контракт будет продлен на 6мес, весь контракт составляет 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 

Мне нужно добавить столбец статуса.

А - нормальный период соглашения

D - когда соглашение удваивается после 6мес, но после того, как 12мес Е (й из Договорана)

Е - где контракт закончен

л - где контракт после 6меса был продлен, после того, как 18mth статус будет типа E

для 321 Клиента после 12меса клыки договора был обновлен с 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

Что такое обратный ход. Реверс всегда начинается с 12 и не может быть <0? Есть только $ 60 и $ 120 руды, есть и другие $? – Mottor

+0

@Mottor: Реверс зависит от столбца длины. Обратный подсчет начинается с первого значения длины. Знаете ли вы, как отличить клиента, который имеет или не удваивает количество, например, на 6-м? Количество может быть различным, например. 20 $, 30 $, 50 $ и так далее. – Merix

+0

Вы видели ответ. Если вы не хотите сравнивать суммы, вы можете использовать аналитическую функцию ROW_NUMBER() OVER (... – Mottor

ответ

0

Если Reverse столбец, что я думаю:

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; 
Смежные вопросы