【问题标题】:How to write a query for getting free seats in a hostel如何编写查询以获得旅馆的免费座位
【发布时间】:2014-06-30 22:23:14
【问题描述】:

我为旅馆创建了一个数据库,我已经在 SQL Server 中构建了所有表,现在我正在尝试编写正弦查询。我想获取有空位的房间号。

我有表StudentsContractsRooms

Contracts 有一个列 Student 引用 Students 中的 StudentIdContracts 有列 Room 引用 Rooms 表的 RoomIdRoomId 是房间号。

Room 也有一个列NumberSeats,它是房间中的座位总数。所以我认为这足以理解我的问题并编写查询。

我想获取其中有可用空位的房间号。我不知道如何实现这一点,我是 SQL 新手,所以我尝试的一切都没有结果。你有什么想法?谢谢。

【问题讨论】:

  • 您能否用您的查询编辑您的问题,即使它们不能正常工作?
  • @Lesya 我可以查询一些人住在某个房间SELECT Count(*) FROM Students WHERE StudentId IN (SELECT Student FROM Contracts WHERE Room=711),仅此而已。我试图解决这个问题,但我不知道如何为每个房间制作它,不确定
  • 如果您将架构和查询发布到 SQL Fiddle 会更好。
  • 使用 Group by 是@Lesya 给出的解决方案

标签: sql sql-server database tsql select


【解决方案1】:

如果您的“合同”表中有 ID 提及的所有学生,则可以通过仅引用“合同”和“房间”来提取数据。您可以尝试将两个表连接起来,计算每个房间的学生人数,然后在 having 子句中添加条件:

SELECT b.RoomId,
  b.NumberSeats,
  COUNT(a.Student)
FROM Rooms b
LEFT JOIN Contracts a
ON a.Room=b.RoomId
GROUP BY b.RoomId,
  b.NumberSeats
HAVING b.NumberSeats>COUNT(a.Student);

【讨论】:

  • 谢谢!这有很大帮助并且工作正常!需要深入挖掘聚合函数
【解决方案2】:

我已经为您准备了这个示例。 ddl + 查询 -->

create table student
(id number,
name varchar2(100));

create table room
(id  number,
name varchar2(100));

create table contract
(student_id number,
room_id number);

create table number_seats
(room_id number,
number_seats number);

insert into student values(1, 'Jon');
insert into student values(2, 'George');
insert into student values(3, 'Ian');
insert into student values(4, 'Alex');
insert into student values(5, 'Mary');

insert into room values(1, 'room1');
insert into room values(2, 'room2');
insert into room values(3, 'room3');
insert into room values(4, 'room4');
insert into room values(5, 'room5');

insert into number_seats values(1, 1);
insert into number_seats values(2, 2);
insert into number_seats values(3, 3);
insert into number_seats values(4, 2);
insert into number_seats values(5, 1);

insert into contract values(1, 1);
insert into contract values(2, 2);
insert into contract values(3, 3);
insert into contract values(4, 4);
insert into contract values(5, 4);

select * from room;
select * from student;
select * from contract;
select * from number_seats;


select cont.room_id, num_seats.number_seats - count(*)
from student st 
join contract cont on st.id=cont.student_id
join room ro on ro.id=cont.room_id
join number_seats num_seats on num_seats.room_id=ro.id
group by cont.room_id, num_seats.number_seats 
union
select ro.id, num_seats.number_seats
from room ro left join contract co on ro.id=co.room_id
join number_seats num_seats on num_seats.room_id=ro.id
where co.room_id is null
order by 1;

结果是

|roomNumber|freeSeats|
|    1     |  0      |
|    2     |  1      |
|    3     |  2      |
|    4     |  0      |
|    5     |  1      |

【讨论】:

  • 感谢您的回答。我知道我需要使用聚合函数,谢谢
猜你喜欢
  • 2013-03-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2021-09-06
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多