2014-02-05 2 views
0

Таблица: подпискаДают скидку на основе подписки года

C_ID SUB_YEAR SUB_AMOUNT DISCOUNT PAID_AMOUNT 
---------------------------------------------------- 
1  1   1250   0  0 
2  2   2520   0  0 
3  8   1459   0  0 
4  6   7456   0  0 
5  1   2584   0  0 
6  3   2578   0  0 
7  4   5478   0  0 
8  5   5000   0  0 

Запрос я нужен,

  • если sub_year> 2, то он/она получить 10% скидку
  • и sub_year> 2 или < = 3, то он получает скидку 20%
  • и sub_year> 3 затем получите 25% скидку.

После выполнения запроса столбец discount и paid_amount должен быть заполнен значениями.

Мой запрос:

BEGIN 
    FOR REC IN(SELECT SUB_YEAR FROM SUBSCRIPTION) 
    LOOP                     
     IF(REC.SUB_YEAR>1 AND REC.SUB_YEAR<=2) THEN 
      UPDATE SUBSCRIPTION 
      SET DISCOUNT = 10,P_AMOUNT= SUB_AMOUNT-SUB_AMOUNT*.1; 
     ELSIF(REC.SUB_YEAR>2 AND REC.SUB_YEAR<=3) THEN 
      UPDATE SUBSCRIPTION 
      SET DISCOUNT = 20,P_AMOUNT= SUB_AMOUNT-SUB_AMOUNT*.2; 
     ELSIF(REC.SUB_YEAR>3) THEN 
      UPDATE SUBSCRIPTION 
      SET DISCOUNT = 25,P_AMOUNT= SUB_AMOUNT-SUB_AMOUNT*.25; 
     ELSE 
      UPDATE SUBSCRIPTION 
      SET DISCOUNT = 0,P_AMOUNT= SUB_AMOUNT; 
     END IF; 
    END LOOP; 

    IF SQL%NOTFOUND THEN 
     Dbms_output.put_line('No Employee Selected'); 
    ElsIF SQl%FOUND THEN 
     Dbms_output.put_line('Employee Selected'); 

    END IF; 
END; 

Проблема для всех строк, то discount столбец заполняется 25% и paid_amount с 25% скидкой sub_amount.

+0

что в DATA_TYPE колонки SUB_YEAR в подписку таблицы – vishad

+0

c_id number, sub_year integer, целочисленное значение sub_amount, целое число со скидкой, целое число p_amount. sub_year - общее количество лет. – user3274067

ответ

2

Вы пропустили пункт в запросе WHERE,

BEGIN 
    FOR REC IN(SELECT SUB_YEAR FROM SUBSCRIPTION) 
    LOOP                     
      IF(REC.SUB_YEAR>1 AND REC.SUB_YEAR<=2) THEN 
       UPDATE SUBSCRIPTION 
       SET DISCOUNT = 10,p_amount= SUB_AMOUNT-SUB_AMOUNT*.1 
       WHERE sub_year >1 and sub_year <= 2 
      ELSIF(REC.SUB_YEAR>2 AND REC.SUB_YEAR<=3) THEN 
       UPDATE SUBSCRIPTION 
       SET DISCOUNT = 20,p_amount= SUB_AMOUNT-SUB_AMOUNT*.2 
       WHERE SUB_YEAR>2 AND SUB_YEAR<=3; 
      ELSIF(REC.SUB_YEAR>3) THEN 
       UPDATE SUBSCRIPTION 
       SET DISCOUNT = 25,p_amount= SUB_AMOUNT-SUB_AMOUNT*.25 
       WHERE SUB_YEAR > 3 
      ELSE 
       UPDATE SUBSCRIPTION 
       SET DISCOUNT = 0,p_amount = SUB_AMOUNT 
       WHERE <condition>; 
      END IF; 
    END LOOP; 
END; 

Или вы можете сделать это с помощью простого UPDATE запроса

UPDATE subscription 
set discount = CASE WHEN sub_year >1 and sub_year <= 2 THEN 10 
        WHEN sub_year >2 and sub_year <= 3 THEN 20 
        WHEN sub_year >3 THEN 25 
       ELSE 0 END, 
    p_amount = CASE WHEN sub_year >1 and sub_year <= 2 THEN SUB_AMOUNT-SUB_AMOUNT*.1 
        WHEN sub_year >2 and sub_year <= 3 THEN SUB_AMOUNT-SUB_AMOUNT*.2 
        WHEN sub_year >3 THEN SUB_AMOUNT-SUB_AMOUNT*.25 
       ELSE SUB_AMOUNT END; 
+0

Спасибо «Dba», что он работает отлично .. и ваш второй запрос является удивительным .... – user3274067