2016-11-07 5 views
-1

Ich brauche eine Flagge erstellen alle Room_IDs zu identifizieren, wo die folgenden erfüllt ist:TSQL: bedingte Abfrage Ausgabe

  • ein „Qc-“ Status innerhalb eines Hotel_ID vorhanden ist.
  • die "Qc-" Status hat eine entsprechende nicht "Qc-" Status (z. B. 'qc-besetzten' & 'besetzt').
  • Die "Qc-" Status muss eine kleinere Room_ID haben als die nicht "Qc-" Status. (ZB Status = 'qc besetzten' hat eine Room_ID = 1 und Status = 'besetzt' hat eine Room_ID = 5)

Dies ist eine vereinfachte Tabelle (TableX) verwende ich als Beispiel:

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

ich brauche die folgenden als Ergebnis:

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

Vielen Dank im Voraus!

+0

Was haben Sie versucht und welche Probleme haben Sie festgestellt? "Ich brauche" zeigt nicht viel Forschung und Arbeit. – HABO

+0

Es tut mir leid, wenn das unhöflich schien, ich bin völlig stecken .. Ich kann keinen Weg sehen, es zum Laufen zu bringen. Ich habe ein Flag erstellt, um einen Status mit seinem QC-Gegenstück zu aggregieren. Flag 1 = FALL WENN [Status] = 'qc-besetzt' oder 'belegt' DANN 'belegt' WANN [Status] = 'qc-frei' oder 'frei' DANN 'frei' ENDE, Flag 2 = FALL WENN [Status] wie 'qc -%' dann 'QC Order' ELSE 'keine QC Order' END, rn = ROW_NUMBER() über (Partition von Hotel_ID Bestellung von Room_Id) –

Antwort

1

Dies ist eine wörtliche Übersetzung der Anforderungen in ziemlich uneleganten Code. Es kann sicherlich verbessert werden, z.B. indem Sie Ihre erste Anforderung ("qc-" vorhanden.) entfernen, da sie in den beiden anderen Anforderungen enthalten ist. Die zweite Anforderung ist implizit im dritten enthalten und erlaubt eine weitere Verbesserung.

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

Danke @HABO das hat perfekt funktioniert, ich verstehe was du hat getan. –