Обновить или выбрать в ORACLE - PullRequest
0 голосов
/ 22 марта 2012

Я использую следующее утверждение;

SELECT RESV_ID, BOOKING_CUS_ID, ACC_ID,
    (SELECT F.FLI_PRICE FROM FLIGHT F WHERE F.FLI_ID = R.IN_FLIGHT_ID) AS DEPART_FLIGHT_PRICE, 
    (SELECT F1.FLI_PRICE FROM FLIGHT F1 WHERE F1.FLI_ID = R.OUT_FLIGHT_ID) AS RETURN_FLIGHT_PRICE, 
    (SELECT AC.ACC_PRICEPN FROM ACCOMMODATION AC WHERE AC.ACC_ID = R.ACC_ID) AS ACCOMMODATION_PRICE
    FROM HOLIDAY_RESERVATION R;

для получения следующих результатов;

   RESV_ID BOOKING_CUS_ID     ACC_ID DEPART_FLIGHT_PRICE RETURN_FLIGHT_PRICE ACCOMMODATION_PRICE
---------- -------------- ---------- ------------------- ------------------- -------------------
         1              1          2                 520                 450                 350
         2              3          4                 250                 150                 150
         3              5          6                 290                 300                 450
         4              7          7                 399                 450                 650
         5              9                            365                 345
         6             11                            558                 460
         7             13                            250                 250
         8             15                            550                 550
         9             17         25                                                         250
        10             19         19                                                         450

10 rows selected.

Вопрос: Как суммировать поля цены, НЕКОТОРЫЕ ЦЕНЫ НЕ ДОСТУПНЫ , потому что бронирование было сделано только для проживания или только для полета, следовательно, оба значения не будут присутствовать всегда, и именно в этом заключается проблема

DEPART_FLIGHT_PRICE RETURN_FLIGHT_PRICE ACCOMMODATION_PRICE

Кроме того: Я хочу вставить или обновить СУММ этих трех значений в ОБЩЕМ в таблице резервирования, возможно, с помощью выбора в или обновления, я потратил целый день, пытаясь это сделать, но мои навыки ограничены. любая помощь будет принята с благодарностью.

Бортовой стол

FLI_ID FLI_CO FLI_AIRCRA DEPT_AIRPORT ARRV_AIRPORT DEPT_TIME                      ARRV_TIME               FLI_PRICE

     1 BD425  Boeing 707            1           12 18-MAR-12 02.24.00 AM          18-MAR-12 06.24.00 AM         520
     2 LX345  Beriev 30             6            7 20-MAR-12 03.30.00 PM          20-MAR-12 04.20.00 PM         250
     3 NZ4445 Boeing 720            9           14 25-MAR-12 09.00.00 AM          25-MAR-12 05.00.00 PM         290
     4 TP351  Boeing 767           10           15 25-MAR-12 11.25.00 AM          25-MAR-12 03.35.00 PM         399
     5 BA472  Boeing 720            5           14 26-MAR-12 01.05.00 PM          26-MAR-12 04.15.00 PM         365

Размещение

ACC_ID ACC_TYPE_CODE ACC_DESC                                           ACC_PRICEPN  ACC_ROOMS  RESORT_ID ACC_ADDR                          CITY_ID

     1             1 Three bedroom bungalow near theme park                     500          3          1
     2             1 Two bedroom bungalow next to disney house                  350          2          1
     3             1 One bedroom bungalow with lake view                        250          2          2
     4             2 One bedroom chalet near the lake                           150          1          2
     5             2 Four bedroom chalet near the tree house                    600          4          3

Бронирование

RESV_ID     EMP_ID BOOKING_CUS_ID RESV_DATE HOLIDAY_S HOLIDAY_E IN_FLIGHT_ID OUT_FLIGHT_ID IN_FLIGHT_SEATS_NO OUT_FLIGHT_SEATS_NO     ACC_ID   SUBTOTAL

     1        338              1 16-FEB-12 18-MAR-12 20-APR-12            1            11                  2                   2          2
     2        335              3 10-JAN-12 20-MAR-12 22-APR-12            2            12                  2                   2          4
     3        338              5 05-MAR-12 25-MAR-12 26-APR-12            3            13                  2                   2          6
     4        328              7 02-JAN-12 25-MAR-12 25-APR-12            4            14                  2                   2          7
     5        311              9 20-JAN-12 26-MAR-12 21-APR-12            5            15                  2                   2
     6        317             11 07-JAN-12 27-MAR-12 22-APR-12            6            16                  2                   2
     7        344             13 29-FEB-12 15-MAR-12 12-APR-12            7            17                  2                   2
     8        326             15 11-JAN-12 18-MAR-12 12-APR-14            8            18                  2                   2
     9        329             17 16-JAN-12 19-MAR-12 17-APR-12                                                                   25
    10        323             19 18-FEB-12 20-MAR-12 21-APR-12                                                                   19

Хорошо, мне удалось получить результаты, которые я хотел

SELECT HR.RESV_ID, F_IN.FLI_ID, F_IN.FLI_PRICE, F_OUT.FLI_ID, F_OUT.FLI_PRICE, AC.ACC_ID, AC.ACC_PRICEPN, NVL(F_IN.FLI_PRICE,0)+NVL(F_OUT.FLI_PRICE,0)+NVL(AC.ACC_PRICEPN,0) AS TOTAL
FROM HOLIDAY_RESERVATION HR 
LEFT JOIN FLIGHT F_IN ON HR.IN_FLIGHT_ID = F_IN.FLI_ID
LEFT JOIN FLIGHT F_OUT ON HR.OUT_FLIGHT_ID = F_OUT.FLI_ID
LEFT JOIN ACCOMMODATION AC ON HR.ACC_ID = AC.ACC_ID
ORDER BY HR.RESV_ID;

ДОХОДНОСТЬ

   RESV_ID     FLI_ID  FLI_PRICE     FLI_ID  FLI_PRICE     ACC_ID ACC_PRICEPN      TOTAL
---------- ---------- ---------- ---------- ---------- ---------- ----------- ----------
         1          1        500         11        555          2         350       1405
         2          2        150         12        253          4         150        553
         3          3        300         13        345          6         450       1095
         4          4        450         14        343          7         650       1443
         5          5        345         15        242                               587
         6          6        460         16        460                               920
         7          7        250         17        250                               500
         8          8        550         18        550                              1100
         9                                                     25         250        250
        10                                                     19         450        450

И следующее утверждение - обновить таблицу бронирования. Спасибо Ли Риффелу из DBA stackxchange за следующий код

UPDATE HOLIDAY_RESERVATION R SET SUBTOTAL = 
   NVL((SELECT F.FLI_PRICE FROM FLIGHT F WHERE F.FLI_ID = R.IN_FLIGHT_ID), 0) +
   NVL((SELECT F.FLI_PRICE FROM FLIGHT F WHERE F.FLI_ID = R.OUT_FLIGHT_ID), 0) +
   NVL((SELECT AC.ACC_PRICEPN FROM ACCOMMODATION AC WHERE AC.ACC_ID = R.ACC_ID), 0);

Теперь промежуточный итог заполняется значениями, полученными из суммы, выполненной выше >>

 RESV_ID     EMP_ID BOOKING_CUS_ID RESV_DATE HOLIDAY_S HOLIDAY_E IN_FLIGHT_ID OUT_FLIGHT_ID IN_FLIGHT_SEATS_NO OUT_FLIGHT_SEATS_NO     ACC_ID   SUBTOTAL
---------- ---------- -------------- --------- --------- --------- ------------ ------------- ------------------ ------------------- ---------- ----------
         1        338              1 16-FEB-12 18-MAR-12 20-APR-12            1            11                  2                   2          2       1405
         2        335              3 10-JAN-12 20-MAR-12 22-APR-12            2            12                  2                   2          4        553
         3        338              5 05-MAR-12 25-MAR-12 26-APR-12            3            13                  2                   2          6       1095
         4        328              7 02-JAN-12 25-MAR-12 25-APR-12            4            14                  2                   2          7       1443
         5        311              9 20-JAN-12 26-MAR-12 21-APR-12            5            15                  2                   2                   587
         6        317             11 07-JAN-12 27-MAR-12 22-APR-12            6            16                  2                   2                   920
         7        344             13 29-FEB-12 15-MAR-12 12-APR-12            7            17                  2                   2                   500
         8        326             15 11-JAN-12 18-MAR-12 12-APR-14            8            18                  2                   2                  1100
         9        329             17 16-JAN-12 19-MAR-12 17-APR-12                                                                   25        250
        10        323             19 18-FEB-12 20-MAR-12 21-APR-12                                                                   19        450

Впоследствии код был добавлен в триггер (что и было первоначальным намерением)

CREATE OR REPLACE TRIGGER HR_SUBTOTAL
BEFORE INSERT OR UPDATE ON HOLIDAY_RESERVATION
FOR EACH ROW
BEGIN
   SELECT 
      NVL((SELECT F.Fli_Price FROM Flight F WHERE F.Fli_ID = :new.In_Flight_ID), 0) +
      NVL((SELECT F.Fli_Price FROM Flight F WHERE F.Fli_ID = :new.Out_Flight_ID), 0) +
      NVL((SELECT AC.Acc_PricePn FROM Accomodation AC WHERE AC.Acc_ID = :new.Acc_ID), 0)
      INTO :new.Subtotal
   FROM dual;
END;
/

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Для SUM, если вы хотите трактовать значения NULL как 0, вам просто нужно сделать NVL для чисел

NVL( DEPART_FLIGHT_PRICE, 0 ) +
NVL( RETURN_FLIGHT_PRICE, 0 ) +
NVL( ACCOMMODATION_PRICE, 0 )

Что касается UPDATEПохоже, вам просто нужно коррелированное выражение UPDATE.

UPDATE reservation r
   SET subtotal = (SELECT (SELECT NVL( DEPART_FLIGHT_PRICE, 0 ) +
                          NVL( RETURN_FLIGHT_PRICE, 0 ) +
                          NVL( ACCOMMODATION_PRICE, 0 )
                     FROM (SELECT RESV_ID, 
                                  BOOKING_CUS_ID, 
                                  ACC_ID,
                                  (SELECT F.FLI_PRICE 
                                     FROM FLIGHT F 
                                    WHERE F.FLI_ID = R.IN_FLIGHT_ID) AS DEPART_FLIGHT_PRICE, 
                                  (SELECT F1.FLI_PRICE 
                                     FROM FLIGHT F1 
                                    WHERE F1.FLI_ID = R.OUT_FLIGHT_ID) AS RETURN_FLIGHT_PRICE, 
                                  (SELECT AC.ACC_PRICEPN 
                                     FROM ACCOMMODATION AC 
                                    WHERE AC.ACC_ID = R.ACC_ID) AS ACCOMMODATION_PRICE
                             FROM dual));
1 голос
/ 22 марта 2012

Вы спрашиваете:

Как мне суммировать поля цены, как вы можете видеть, что некоторые из них могут иметь нули.

DEPART_FLIGHT_PRICE RETURN_FLIGHT_PRICE ACCOMMODATION_PRICE

Просто приложитеони в NVL функционируют следующим образом:

NVL(DEPART_FLIGHT_PRICE, 0)

, а затем суммируют их.

Для второй части вам понадобится оператор MERGE.Хорошим примером является http://www.oracle -developer.net / display.php? Id = 203

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...