Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将状态添加到表中_Sql_Oracle_Plsql - Fatal编程技术网

Sql 如何将状态添加到表中

Sql 如何将状态添加到表中,sql,oracle,plsql,Sql,Oracle,Plsql,我有下表,其中是从我的数据库剪辑。我有两种合同 I:客户支付前6个月60美元,下一个6个月120美元111客户 II:客户支付前6个月的60美元,但如果仍然支付60美元,合同将在第6个月延长,整个合同为18个月。321名仍在付款的客户 ID_Client | Amount | Amount_charge | Lenght | Date_from | Date_to | Reverse ---------------------------------------------------

我有下表,其中是从我的数据库剪辑。我有两种合同

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
我需要添加状态栏

A-正常协议期限

D-协议在第6个月后翻倍,但在第12个月后即为协议结束

E-合同完成的地方

L-如果合同在6个月后延期,18个月后状态将为E类

对于第12日之后的321名客户,合同期限从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

如果反向列是我所想的:

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;

什么是相反的。倒档是否总是从12开始,并且不能小于0?只有60美元和120美元的矿石还有其他的吗?@motor:这取决于长度栏。反向计数从长度的第一个值开始。您是否知道如何区分客户在6个月后的金额是否翻倍?金额可能不同,例如20美元、30美元、50美元等等。您看到答案了吗。如果不想比较总和,可以使用分析函数ROW_NUMBER OVER。。。