2016-11-07 17 views
-1

私は、次が満たされているすべてのRoom_IDsを識別するためのフラグを作成する必要があります。TSQL:条件付きクエリの問題

  • 「Qc-」Statusは1 Hotel_ID内に存在します。
  • 「Qc-」Statusは、対応する「Qc」を有していない(例えば、 'qc-occupied'' occupied ')。
  • 「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カウンターパートに集約するフラグを作成しました。 フラグ1 = [ステータス] = 'qc占有'または '占有' THEN '占有' [ステータス] = 'qc-vacant'または 'vacant'の場合THEN '空き' END、 フラグ2 = CASE WHEN [ステータス] 'qc - %'と 'QC Order'のようにELSE 'None QC Order' END、 rn = ROW_NUMBER()以上(Room_IdによるHotel_ID注文によるパーティション) –

答えて

1

これは要件の文字通りの翻訳です。確実に改善することができます。他の2つの要件に暗黙的に含まれているため、最初の要件(「qc-」現在)を削除します。 2番目の要件は3番目の要件に暗黙的に記載されており、別の改善が可能です。

-- 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

これは完璧に働いてくれてありがとうございます。した。 –