【问题标题】:Creating a view with sums from multiple tables (Oracle SQL)使用多个表的总和创建视图 (Oracle SQL)
【发布时间】:2013-09-30 10:10:59
【问题描述】:

我正在尝试创建一个视图来获取不同表中不同行的总和。 (我不知道如何正确解释)

我的表格是这样排列的:

访客:

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

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

要获得房价,总和为 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;

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

【问题讨论】:

    标签: sql oracle views sum


    【解决方案1】:

    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;
    

    【讨论】:

    • 优秀。这完美地工作。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2020-06-30
    相关资源
    最近更新 更多