如何选择同一人预订的房间的整体价格

问题描述 投票:0回答:1

我创建了一个表:

Create table rooms
(
roomNo int not null,
hotelNo int not null,
hotelName varchar (40) not null,
roomType varchar (40)
default 'standard' check (roomType in ('single', 'double', 'master', 
'standard', 'president')),
price decimal (8,2) check (price>=0 and price<=99999),
guestNo int null
)

roomNohotelNo是主键,guestNo是外键。

该表填充了值:

(101, 123456, 'Home','standard',300, 54321)
(101, 654321, 'Ibis','standard',300, Null)
(101, 987654, 'Hiton','president',15000, null)
(222, 987654, 'Hiton','standard',300, 12345)
(321, 987654, 'Hiton','master',1000, 11111)
(333, 123456, 'Home','single',100, null)
(333, 987654, 'Hiton','standard',300, 12345)
(567, 654321, 'Ibis','standard',300, null)
(888, 654321, 'Ibis','single' ,100, null)
(999, 654321, 'Ibis','double' ,200, null) 

如何回答“选择同一人预订房间的整体价格”这一问题?

我想得到600的总价格,但基于这个查询,我得到1900:

select sum(price)
from rooms r inner join guests g
on r.guestNo = g.guestNo and g.guestName = g.guestName
sql oracle
1个回答
0
投票

如果您想要每个人的总价格,那么您需要按该值进行分组:

select g.guestNo, sum(r.price)
from rooms r inner join guests g
on r.guestNo = g.guestNo
group by g.guestNo
order by g.guestNo;

   GUESTNO SUM(R.PRICE)
---------- ------------
     11111         1000
     12345          600
     54321          300

如果您只对有多个房间入口的客人感兴趣,那么您可以添加一个having条款来检查有多少:

select g.guestNo, sum(r.price)
from rooms r inner join guests g
on r.guestNo = g.guestNo
group by g.guestNo
having count(r.roomNo) > 1
order by g.guestNo;

   GUESTNO SUM(R.PRICE)
---------- ------------
     12345          600

Read more

您的数据模型似乎很奇怪,顺便提一下;在房间里记录特定的客人似乎很奇怪。也许你应该从中移除guestNo,并有另一张桌子将房间连接到客人,也许是日期范围。价格可能会有所不同,因此可能需要在预订表中,或在另一个表中(以允许季节性定价等)?

© www.soinside.com 2019 - 2024. All rights reserved.