使用多个表中的总和创建视图(Oracle SQL)

时间:2013-09-30 10:10:59

标签: sql oracle views sum

我正在尝试创建一个视图,它可以获取各种表中几个不同行的总和。 (我不确定如何正确解释这个)

以下是我的表格列出方式:

访问者:

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

服务:

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

我想创建一个名为bill的视图,它可以为我提供所有服务的总成本和成本。

要获得房价,总和是rooms.price * bookings.bookingdays。 对于服务,它是services表中与booking_services中的SERVICEID匹配的匹配bookingID的所有行的总和。

目前所有表格中的行数比我显示的要多(所以这里不占用太多空间)我有一个查询,但它只显示了我想要的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;

任何有助于获得我所追求的东西的帮助(如果这有任何意义)将不胜感激。

1 个答案:

答案 0 :(得分: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;