数据库作业技术问询:统计有预订宾客的预订次数并按宾客编号排序
数据库作业SQL查询解答
需求回顾
针对每位至少完成一次预订的宾客,列出其宾客编号(Guest_No)及预订总次数,并按宾客编号排序。
已知表结构
create table Guest ( Guest_No char(6), Guest_Name char(30) not null, Address char(40), constraint Guest_PK primary key (Guest_No) ); create table Booking ( Hotel_No char(3), Guest_No char(6) not null, Date_From date, Date_To date not null, Room_No char(4), -- 补充合理的外键约束,关联宾客表 constraint Booking_Guest_FK foreign key (Guest_No) references Guest(Guest_No) );
核心解决方案SQL语句
SELECT Guest_No, COUNT(*) AS 预订总次数 FROM Booking GROUP BY Guest_No HAVING COUNT(*) >= 1 ORDER BY Guest_No ASC;
思路拆解(人话版)
- 直接从
Booking表取数就行,毕竟统计预订次数只需要这里的宾客编号数据 GROUP BY Guest_No:把同一个宾客的所有预订记录归为一组,这样才能单独统计每个人的次数COUNT(*):数每组里的记录条数,就是该宾客的预订总次数,用AS给结果列起个好懂的别名HAVING COUNT(*) >= 1:严格对应题目里“至少完成一次预订”的要求,虽然从Booking表取数默认都是有预订的,但加上这个更严谨ORDER BY Guest_No ASC:最后按宾客编号升序排列,完全符合题目排序要求
进阶严谨版(关联宾客表校验)
如果要确保统计的都是Guest表中存在的有效宾客(避免Booking表出现无效宾客编号),可以用内关联版本:
SELECT g.Guest_No, COUNT(b.Guest_No) AS 预订总次数 FROM Guest g INNER JOIN Booking b ON g.Guest_No = b.Guest_No GROUP BY g.Guest_No ORDER BY g.Guest_No ASC;
这个版本会自动过滤掉没有预订记录的宾客,因为内关联只会保留两张表都匹配的记录。
内容的提问来源于stack exchange,提问作者AllisterRegdarCrowley
相关产品推荐
相关产品推荐

