I am attempting to query the hotel database to find the total cost of a booking. I am using a sub-select query however I am constantly receiving an error.

This is the query, I want it to display the booking id and room number along with total cost.

    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; 

This is the error:

ERROR at line 3:
ORA-00907: missing right parenthesis
有帮助吗?

解决方案

Well you have a few issues.

First, you have two FROMs in the query one before the subquery and one after the subquery.

Second, you have no GROUP BY but you have an aggregate function being used.

It seem like you might want:

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, if you want a TOTAL row, then you can use 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);

See SQL Fiddle with Demo

If you want the data in a column, then you can use a Common Table Expression on the subquery:

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
 ) 

See SQL Fiddle with Demo

其他提示

Although I'm not sure where in your schema the various attributes are, try this:

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   
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top