2013-03-20 3 views
0

Я пытаюсь запросить базу данных отеля, чтобы найти общую стоимость бронирования. Я использую запрос подвыбора, но я постоянно получаю сообщение об ошибке.SQL sub-select query

Это запрос, я хочу, чтобы он отображал идентификатор бронирования и номер комнаты вместе с общей стоимостью.

SELECT BOOKING_ID, ROOM_NO , SUM(TOTAL) AS TOTAL FROM 
    (
     SELECT (END_DATE-START_DATE) DAYDIFF, ((END_DATE-START_DATE)*ROOM_PRICE) TOTAL_ROOM 
     FROM ROOM_TBL NATURAL JOIN ROOM_DETAILS_TBL WHERE BOOKING_ID = &BOOKING_ID 
    ) FROM ROOM_TBL; 

Это ошибка:

ERROR at line 3: 
ORA-00907: missing right parenthesis 
+1

слишком много FROMs там, удалите один за последний) –

+0

что мне нравится в Oracle, это превращает любую ошибку в ошибку «отсутствующей скобки». Я уверен, что если у вас закончится дисковое пространство, вы получите «отсутствующую скобку». –

ответ

0

Ну у вас есть несколько вопросов.

Во-первых, у вас есть два FROM s в запросе один перед подзапросом и один после подзапроса.

Во-вторых, у вас нет GROUP BY, но вы используете функцию агрегата.

Это похоже, как вы можете:

SELECT BOOKING_ID, ROOM_NO , SUM(TOTAL) AS TOTAL 
FROM 
(
    SELECT BOOKING_ID, 
     ROOM_NO, 
     (END_DATE-START_DATE) DAYDIFF, 
     ((END_DATE-START_DATE)*ROOM_PRICE) TOTAL 
    FROM ROOM_TBL 
    NATURAL JOIN ROOM_DETAILS_TBL 
    WHERE BOOKING_ID = &BOOKING_ID 
) 
GROUP BY BOOKING_ID, ROOM_NO; 

Edit, если вы хотите TOTAL строку, то вы можете использовать GROUP BY ROLLUP:

SELECT max(BOOKING_ID) Booking_id, 
    case when ROOM_NO is null then ' ' else room_no end Room_no, 
    SUM(TOTAL) AS TOTAL 
FROM 
(
    SELECT BOOKING_ID, 
     ROOM_NO, 
     (END_DATE-START_DATE) DAYDIFF, 
     ((END_DATE-START_DATE)*ROOM_PRICE) TOTAL 
    FROM ROOM_TBL 
    NATURAL JOIN ROOM_DETAILS_TBL 
    WHERE BOOKING_ID = &BOOKING_ID 
) 
GROUP BY ROLLUP (room_no); 

См SQL Fiddle with Demo

Если вы хотите данных в столбце, то вы можете использовать выражение общей таблицы в подзапросе:

with cte as 
(
    SELECT BOOKING_ID, 
     ROOM_NO, 
     (END_DATE-START_DATE) DAYDIFF, 
     ((END_DATE-START_DATE)*ROOM_PRICE) TOTAL 
    FROM ROOM_TBL 
    NATURAL JOIN ROOM_DETAILS_TBL 
) 
select booking_id, 
    room_no, 
    total, 
    case when rn = 1 then totalbooking else null end totalbooking  
from 
(
    select booking_id, 
     room_no, 
     total, 
     (select sum(total) from cte) TotalBooking, 
     row_number() over(partition by booking_id order by room_no) rn 
    from cte 
) 

См SQL Fiddle with Demo

+0

Немного незапрашиваемого совета: убедитесь, что вы ограничиваете 'ROOM_TBL.START_DATE' и' ROOM_TBL.END_DATE' только на дату (без компонента времени), или вы получите очень странные результаты. Не доверяйте другим программистам (или вам самим, если на то пошло), чтобы сохранить дату чистой. Вы можете применить это с контрольным ограничением: 'CHECK (END_DATE = TRUNC (END_DATE))' и аналогичный для 'START_DATE'. –

+0

Я попытался выполнить запрос таким образом, но по-прежнему получил ту же ошибку: ОШИБКА в строке 7: ORA-00907: отсутствует правая скобка – user1909680

+0

@ user1909680 Можете ли вы отредактировать исходное сообщение с структурами таблиц и некоторыми образцами данных? – Taryn

0

Хотя я не уверен, где в схеме различные атрибуты, попробуйте следующее:

SELECT z.BOOKING_ID, r.ROOM_NO , SUM(TOTAL) TOTAL 
FROM (SELECT ri.room_No, dt.Booking_id, 
      (END_DATE-START_DATE) DAYDIFF, 
      ((END_DATE-START_DATE)*ROOM_PRICE) TOTAL 
     FROM ROOM_TBL ri 
      NATURAL JOIN ROOM_DETAILS_TBL dt 
     WHERE BOOKING_ID = &BOOKING_ID) z 
    Join ROOM_TBL r 
    On r.ROOM_NO = z.Room_No 

 Смежные вопросы

  • Нет связанных вопросов^_^