好你的几个问题。
首先,在子查询之前的查询中有两个FROM
,子查询之后有一个。
其次,你没有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;
编辑,如果你想有一个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
太多栌那里,删除后的最后一个) – 2013-03-20 17:53:45
的我喜欢Oracle的东西是它将任何错误转化为“缺少括号”错误。我很确定,如果磁盘空间不足,你会得到'缺少括号'。 – 2013-03-20 17:55:36