2016-11-07 101 views
-1

我需要创建一个标志来识别所有Room_IDs下满足其中:TSQL:条件查询问题

  • 了“QC-” Status是一个Hotel_ID内。
  • “Qc-”Status具有相应的非“Qc-”Status(例如, 'qc-占用'&'占用')。
  • “Qc-”Status必须具有比 非“Qc-”Status更小的Room_ID。 (例如Status = 'QC-占用' 具有Room_ID = 1和Status = '占用' 具有Room_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 

预先感谢您!

+0

你有什么试过,你遇到了什么问题? “我需要”并没有显示出很多研究和工作。 – HABO

+0

对不起,如果这似乎不礼貌,我完全卡住..我看不到一种方法,使其工作。 我已经创建了一个标志来汇总与QC对应方的状态。 flag 1 = CASE WHEN [status] ='qc-occupied'或'占用'THEN'占用' WHEN [status] ='qc-vacant'或'vacant'THEN'空缺'END, flag 2 = CASE WHEN [status] like'qc - %'then'QC Order'ELSE'None QC Order'END, rn = ROW_NUMBER()over(由Room_Id按Hotel_ID排序) –

回答

1

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

-- 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; 
+0

谢谢@HABO这个工作完美,我明白你没有。 –