You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数据库作业技术问询:统计有预订宾客的预订次数并按宾客编号排序

数据库作业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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:00:21