房间表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语句,或者写点思路。

解决方案 »

  1.   

    最好给出完整的表结构,测试数据,计算方法和正确结果.发帖注意事项
    http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
      

  2.   

    select code,
    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没数据,不一定对。
      

  3.   

    SELECT code,
    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
      

  4.   

    请问如何把表里的数据返回成insert语句,让大家能用。。
      

  5.   

    测试数据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房间    空闲