Sql server TSQL:条件查询问题
我需要创建一个标志来标识满足以下条件的所有房间ID: 一个酒店ID内存在Qc状态。 Qc-状态具有相应的非Qc-状态,例如。 “qc占用”和“占用”。 Qc-状态必须有一个比 非Qc-状态。e、 g.状态=‘qc已占用’的房间ID=1,状态=‘已占用’的房间ID=5 这是一个简化的表格tableX,我正在使用它作为示例: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
**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这非常有效,我理解你所做的。