Ну у вас есть несколько вопросов.
Во-первых, у вас есть два 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
слишком много FROMs там, удалите один за последний) –
что мне нравится в Oracle, это превращает любую ошибку в ошибку «отсутствующей скобки». Я уверен, что если у вас закончится дисковое пространство, вы получите «отсутствующую скобку». –