2014-05-13 83 views
0

我创建了一个旅馆的数据库,我已经建立了SQL Server中的所有表,现在我正在尝试编写正弦查询。我想获得带有免费座位的房间号码。如何写一个查询获得免费座位在旅馆

我有表Students,Contracts,Rooms

Contracts具有柱Student它引用在StudentsContractsStudentId具有引用Rooms表的RoomIdRoomRoomId是房间号码。

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

我想获得带有空闲座位的房间号码。我不知道如何实现这个,我是SQL中的新成员,所以我所尝试的一切都没有成功。你有什么想法?谢谢。

+0

你能与您的查询(ES),即使他们无法正常工作编辑您的问题吗? –

+0

@Lesya我可以做一个查询,让一些人住在某个房间里'SELECT Count(*)FROM Students WHERE StudentId IN(SELECT Student from Contracts WHERE Room = 711)'这就是全部。我试图解决这个问题,但我无法得到如何为每个房间做好准备 – user3061137

+0

如果你将架构和查询发布到[SQL Fiddle](http:// sqlfiddle.com/)。 –

回答

0

如果您的合同表中提供了由其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); 
+0

谢谢!这帮助了很多,并且工作正常!需要深入了解汇总功能 – user3061137

+0

欢迎您 –

0

我准备这个例子给你。 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  | 
+0

谢谢您的回答。我知道我需要使用聚合函数,谢谢 – user3061137

相关问题