我创建了一个表:
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
)
roomNo
和hotelNo
是主键,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
如果您想要每个人的总价格,那么您需要按该值进行分组:
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
您的数据模型似乎很奇怪,顺便提一下;在房间里记录特定的客人似乎很奇怪。也许你应该从中移除guestNo
,并有另一张桌子将房间连接到客人,也许是日期范围。价格可能会有所不同,因此可能需要在预订表中,或在另一个表中(以允许季节性定价等)?