2013-09-30 36 views
0

我试图创建一个视图来获取各种表中几个不同行的总和。 (我不知道怎么解释这个正确)使用多个表中的总和创建视图(Oracle SQL)

这里是我的表是如何设置的:

访问者:

VISITORID FNAME   LNAME   PHONE    HOTELID 
---------- --------------- --------------- --------------- ---------- 
     23 Bella   Morgan   0394110625    3 

预订:

BOOKINGID HOTELID  ROOMNO BOOKINGDATE   BOOKINGDAYS BEDANDBREA VISITORID 
---------- ---------- ---------- ------------------- ----------- ---------- ---------- 
     28   3  509 28-04-2013 00:00:00   3 Yes    23 

客房:

ROOMNO HOTELID ROOMTYPE     PRICE 
---------- ---------- ------------------------- ---------- 
     509   3 Double     700 

Se rvices:

SERVICEID SERVICENAME          COST   HOTELID 
---------- -------------------------------------------------- ---------- ---------- 
1-CLTH  Cloth Cleaning          14.95    1 
2-RMSV  Room Service          9.95    2 

Booking_services:

SERVICEID BOOKINGID 
---------- ---------- 
2-RMSV    32 
1-CLTH    32 

我想创建一个名为票据观点,让我总房费和所有服务的成本。

要得到房间价格,总和是rooms.price * bookings.bookingdays。 对于服务,它是services表中与booking_services中的SERVICEID匹配的所有行的总和,用于匹配的预订标识号。

当前所有表格中的行数比我所显示的多(所以它不占用太多空间),并且我有一个查询但它只显示2个访问者就像总数一样。我知道这是因为第5行,但我不确定我如何计算以及那些在booking_services中没有排名的人。

下面是查询:

CREATE VIEW bills AS 
SELECT v.fname, SUM((r.price*b.bookingdays)+s.cost) AS total 
FROM visitors v, rooms r, bookings b, services s, booking_services bs 
WHERE v.visitorid = b.visitorid 
AND 
s.serviceid in(select bs.serviceid from booking_services where bs.bookingid = b.bookingid) 
AND 
b.roomno = r.roomno 
GROUP BY v.fname; 

任何帮助得到我之后,我(如果这让任何意义),将不胜感激。

回答

0

Here is the SQLFiddel Demo

你可以试试下面的查询您的观点:

Select v.fname, sum((r.price*b.bookingdays)+nvl(bso.cost,0)) 
    From visitors v 
    Join bookings b 
    on v.visitorid = b.visitorid 
    Join rooms r 
    on b.roomno = r.roomno 
    left outer join (select bs.BOOKINGID,sum(cost) as cost 
        from booking_services bs 
        Join services s 
         on s.SERVICEID = bs.SERVICEID 
        group by bs.BOOKINGID) bso 
    on bso.BOOKINGID = b.BOOKINGID 

GROUP BY v.fname; 
+0

优秀。这工作完美。非常感谢你。 –