Sql server TSQL:条件查询问题

Sql server TSQL:条件查询问题,sql-server,tsql,conditional,Sql Server,Tsql,Conditional,我需要创建一个标志来标识满足以下条件的所有房间ID: 一个酒店ID内存在Qc状态。 Qc-状态具有相应的非Qc-状态,例如。 “qc占用”和“占用”。 Qc-状态必须有一个比 非Qc-状态。e、 g.状态=‘qc已占用’的房间ID=1,状态=‘已占用’的房间ID=5 这是一个简化的表格tableX,我正在使用它作为示例: **Hotel_ID Room_Id Status** 1 1 vacant 1

我需要创建一个标志来标识满足以下条件的所有房间ID:

一个酒店ID内存在Qc状态。 Qc-状态具有相应的非Qc-状态,例如。 “qc占用”和“占用”。 Qc-状态必须有一个比 非Qc-状态。e、 g.状态=‘qc已占用’的房间ID=1,状态=‘已占用’的房间ID=5 这是一个简化的表格tableX,我正在使用它作为示例:

 **Hotel_ID  Room_Id     Status**
      1         1        vacant          
      1         2        qc-occupied  
      1         3        vacant          
      2         1        occupied       
      2         2        qc-vacant       
      2         3        vacant          
      3         1        qc-vacant       
      4         1        vacant         
      4         2        occupied        
      4         3        qc-vacant
      5         1        vacant 
因此,我需要以下信息:

 **Hotel_ID  Room_Id     Status         flag**
      1         1        vacant          0
      1         2        qc-occupied     0
      1         3        vacant          0 
      2         1        occupied        0
      2         2        qc-vacant       1
      2         3        vacant          1
      3         1        qc-vacant       0
      4         1        vacant          0
      4         2        occupied        0
      4         3        qc-vacant       0
      5         1        vacant          0

提前谢谢你

这是将需求直译成相当不雅的代码。它当然可以改进,例如通过删除您的第一个要求qc-present。因为它隐含在其他两个需求中。第二个要求隐含在第三个要求中,允许另一个改进

-- Sample data.
declare @TableX as Table ( Hotel_Id Int, Room_Id Int, Stat VarChar(16) );
insert into @TableX ( Hotel_Id, Room_Id, Stat ) values
  ( 1, 1, 'vacant' ), ( 1, 2, 'qc-occupied' ), ( 1, 3, 'vacant' ), 
  ( 2, 1, 'occupied' ), ( 2, 2, 'qc-vacant' ), ( 2, 3, 'vacant' ), 
  ( 3, 1, 'qc-vacant' ),
  ( 4, 1, 'vacant' ), ( 4, 2, 'occupied' ), ( 4, 3, 'qc-vacant' ), 
  ( 5, 1, 'vacant' );
select * from @TableX;

-- Literal translation of requirements.
declare @False as Bit = 0, @True as Bit = 1;
select Hotel_Id, Room_Id, Stat,
  QC_In_Hotel, QC_And_NonQC_In_Hotel, QC_Precedes_NonQC_In_Hotel,
  case when QC_In_Hotel = @True and QC_And_NonQC_In_Hotel = @True and
    QC_Precedes_NonQC_In_Hotel = @True then @True else @False end as Flag
  from (
    select Hotel_Id, Room_Id, Stat,
      -- Req: a "Qc-" Status is present within one Hotel_ID.
      case when exists ( select 42 from @TableX as I
        where I.Hotel_Id = O.Hotel_Id and I.Stat like 'qc-%' )
        then @True else @False end as QC_In_Hotel,
      -- Req: the "Qc-" Status has a corresponding non "Qc-" Status (e.g. 'qc-occupied' & 'occupied').
      case when exists ( select 42 from @TableX as I
        where I.Hotel_Id = O.Hotel_Id and
          ( ( I.Stat like 'qc-' + O.Stat ) or ( O.Stat like 'qc-' + I.Stat ) ) )
        then @True else @False end as QC_And_NonQC_In_Hotel,
      -- Req: the "Qc-" Status has to have a to have a smaller Room_ID than the non "Qc-" Status.
      case when exists ( select 42 from @TableX as I
        where I.Hotel_Id = O.Hotel_Id and
          ( ( I.Room_Id < O.Room_Id and I.Stat like 'qc-' + O.Stat ) or
            ( O.Room_Id < I.Room_Id and O.Stat like 'qc-' + I.Stat ) ) )
        then @True else @False end as QC_Precedes_NonQC_In_Hotel
      from @TableX as O ) as PH
  order by Hotel_Id, Room_Id;

您尝试过什么,遇到了什么问题?我需要的不是太多的研究和工作。如果这看起来不礼貌,我很抱歉,我完全被卡住了。。我看不出有什么办法使它起作用。我已经创建了一个标志,用于将状态与其QC对应项聚合。标志1=当[状态]=“qc占用”或“占用”时的情况,然后当[状态]=“qc空置”或“空置”时的情况,然后是“空置”结束,标志2=当[状态]如“qc-%”,然后是“qc订单”或“无qc订单”结束时的情况,rn=隔墙上的行号,按酒店ID排序,按房间排序,谢谢@HABO这非常有效,我理解你所做的。