2016-11-07 2 views
-1

нужно создать флаг, чтобы определить все Room_IDs где следующие встречают:TSQL: условный выпуск запроса

  • в «Qc-» Status присутствует в одном Hotel_ID.
  • «Qc-» Status имеет соответствующий «Qc-» Status (например, «занятый qc» & «занят»).
  • «Qc-» Status должен иметь меньший Room_ID, чем не «Qc-» Status. (Например, Status = «дс занимаемого» имеет 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-busy' или 'занято' THEN 'занято' WHEN [status] = 'qc-vacant' или 'vacant' THEN 'vacant' END, flag 2 = CASE WHEN [status] like 'qc -%' then 'QC Order' ELSE 'None QC Order' END, rn = ROW_NUMBER() over (раздел по адресу Hotel_ID by Room_Id) –

ответ

1

Это буквальный перевод требований в довольно неэлегантный код. Это, безусловно, может быть улучшено, например. удалив первое требование («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; 
+0

Спасибо @HABO, это сработало отлично, я понимаю, что вы сделал. –

Смежные вопросы