另外一贴的60分会一起给你的,谢谢!
房间表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语句,或者写点思路。CREATE TABLE [dbo].[h_rooms](
[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房间    空闲

解决方案 »

  1.   

    select code,
    case when exists(select 1 from h_book where room = t.id and checkid is null
    and sdate <= '2010-04-30') then 
    '已预订' when exists (select 1 from h_check where room = t.id and outid is null
    and sdate <= '2010-04-30')
    then '已入住未退房'
    else '空闲' end as  状态
    from h_rooms tcode                                               状态
    -------------------------------------------------- ------------
    102房间                                              已入住未退房
    202房间                                              空闲
    302房间                                              空闲
    105房间                                              已入住未退房
    205房间                                              空闲(5 行受影响) 302房间 五月二号才预定的 你的结果有问题
      

  2.   

    nianran520,一楼,你去这个帖子顶1下,给你分数, 一共80分
    http://topic.csdn.net/u/20100429/11/e28b08d3-a8b3-4425-952b-68fad1d26ef8.html?seed=1275365616&r=65067311#r_65067311
    多谢!