房间表h_rooms,有字段id,code(房间号)
预约表h_book,有字段id,room(房间id),sdate(预约时间),checkid(登记入住表id,如果该笔预约被登记入住了,入住表的ID写入这里,不然是null)
入住表h_check,有字段id,room(房间id),sdate(入住时间),outid(退房表id,如果该笔入住被登记退房了,退房表的ID写入这里,不然是null)
退房表h_checkout,有字段id,pid(入住表的id),sdate(退房时间)
现在要做一份报表,统计某个时间点的房间状态,三种状态分别为:预约未入住、已入住未退房、空闲。
房间号 状态
101 空闲
102 已入住未退房
查询结果房间号肯定不能重复!请帮我写下SQL语句,或者写点思路。
预约表h_book,有字段id,room(房间id),sdate(预约时间),checkid(登记入住表id,如果该笔预约被登记入住了,入住表的ID写入这里,不然是null)
入住表h_check,有字段id,room(房间id),sdate(入住时间),outid(退房表id,如果该笔入住被登记退房了,退房表的ID写入这里,不然是null)
退房表h_checkout,有字段id,pid(入住表的id),sdate(退房时间)
现在要做一份报表,统计某个时间点的房间状态,三种状态分别为:预约未入住、已入住未退房、空闲。
房间号 状态
101 空闲
102 已入住未退房
查询结果房间号肯定不能重复!请帮我写下SQL语句,或者写点思路。
解决方案 »
- 我现在想问的是如何用一个Select 来完成查询
- 如何通过ssms来重启或者启动远程的sqlserver2005?
- 请教交叉表(行转列) 查询 精髓
- 存储过程如何插入、更新ntext列的数据
- 如何对两个表中地址字段的内容进行比对?
- 求助:局域网内访问mssql2005 速度非常慢
- 新手:sqlserver中正负数转换的问题
- 求一条SQL语句!!
- 请用SQL Server除了Convert以外还有更功能更强大的格式化函数吗?
- ^_^ 各位都来帮帮忙﹐很简单的问题﹗^_^
- |zyciis| 在一个商品列表中,取得当前这些商品的最前级的商品类型,谢谢 有完整测试代码
- 当tcp连接不上的时候,不做数据库操作??
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
case when exists(select 1 from h_book where room = t.id and checkid is null) then
'预约未入住' when exists (select 1 from h_check where room = t.id and outid is null)
then '已入住未退房'
else '空闲' end
from h_rooms t没数据,不一定对。
CASE WHEN book.room IS NULL AND (chk.room IS NULL OR chk.outid IS NOT NULL) THEN '空闲'
WHEN book.room IS NOT NULL AND book.checkid IS NULL THEN '预约未入住'
WHEN chk.room IS NOT NULL AND chk.outid IS NULL THEN '已入住未退房'
END
FROM h_rooms r
LEFT JOIN
(
SELECT room,checkid
FROM h_book
WHERE sdate BETWEEN 'date1' AND 'date2'
) book
ON r.id=book.room
LEFT JOIN
(
SELECT room,outid
FROM h_check
WHERE sdate BETWEEN 'date1' AND 'date2'
) chk
ON r.id=book.room
GROUP BY code
[id] [varchar](16) COLLATE Chinese_PRC_CI_AS NOT NULL,
[code] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
insert into h_rooms values('rid001','102房间')
insert into h_rooms values('rid002','202房间')
insert into h_rooms values('rid003','302房间')
insert into h_rooms values('rid004','105房间')
insert into h_rooms values('rid005','205房间')CREATE TABLE [dbo].[h_book](
[id] [varchar](16) COLLATE Chinese_PRC_CI_AS NOT NULL,
[room] [varchar](16) COLLATE Chinese_PRC_CI_AS NULL,
[sdate] [datetime] NULL,
[checkid] [varchar](16) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
insert into h_book values('bid001','rid005','2010-04-28 00:00:00.000','cid001')
insert into h_book values('bid002','rid002','2010-04-25 00:00:00.000','cid002')
insert into h_book values('bid003','rid003','2010-05-02 00:00:00.000',null)CREATE TABLE [dbo].[h_check](
[id] [varchar](16) COLLATE Chinese_PRC_CI_AS NOT NULL,
[room] [varchar](16) COLLATE Chinese_PRC_CI_AS NULL,
[sdate] [datetime] NULL,
[outid] [varchar](16) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
insert into h_check values('cid001','rid005','2010-04-29 00:00:00.000','outid001')
insert into h_check values('cid002','rid002','2010-04-26 00:00:00.000','outid002')
insert into h_check values('cid003','rid004','2010-04-26 00:00:00.000',null)
insert into h_check values('cid004','rid001','2010-04-27 00:00:00.000',null)CREATE TABLE [dbo].[h_checkout](
[id] [varchar](16) COLLATE Chinese_PRC_CI_AS NOT NULL,
[pid] [varchar](16) COLLATE Chinese_PRC_CI_AS NULL,
[sdate] [datetime] NULL
) ON [PRIMARY]
insert into h_checkout values('outid001','cid001','2010-04-30 00:00:00.000')
insert into h_checkout values('outid002','cid002','2010-04-27 00:00:00.000')
希望得到的结果是'2010-04-30 00:00:00.000'这天的房间状态表
房间号 状态
102房间 已入住未退房
202房间 空闲
302房间 已预订
105房间 已入住未退房
205房间 空闲