每行都有一个ID和一个类别存在/状态组合。示例代码:
DECLARE @sample_table TABLE (
Id INT
,Category_Alpha BIT
,Category_Beta BIT
,Category_Charlie BIT
,Status_Alpha CHAR(8)
,Status_Beta CHAR(8)
,Status_Charlie CHAR(8)
);
INSERT INTO @sample_table
VALUES
(1,1,0,0,'Approved','Open','Open')
,(2,1,1,0,'Pending','Approved','Open')
,(3,0,0,1,'Open','Open','Rejected')
,(4,0,1,0,'Open','Approved','Open')
,(5,1,1,1,'Approved','Rejected','Approved');
SELECT * FROM @sample_table;
产生:
Id Category_Alpha Category_Beta Category_Charlie Status_Alpha Status_Beta Status_Charlie
1 1 0 0 Approved Open Open
2 1 1 0 Pending Approved Open
3 0 0 1 Open Open Rejected
4 0 1 0 Open Approved Open
5 1 1 1 Approved Rejected Approved
因此,每行可以有一个“ Alpha”(是/否)和一个对应的“ Alpha”状态(“待定”,“已批准”等)。其他类别(Beta和Charlie)也是如此。 空的类别始终具有“打开”状态。例如,Id为1的行的Category_Beta = 0(否),因此相应的Status_Beta为“打开”。
在示例中,我提供了3个类别(Alpha,Beta,Charlie),但我的实际数据有40多个类别。 我想找到所有“非空缺”类别都为“已批准”的行。在提供的示例中,这将是第1行和第4行。
答案 0 :(得分:2)
这只是一个复杂的where
子句:
select t.*
from t
where (category_alpha = 0 or status_alpha = 'Approved') and
(category_beta = 0 or status_beta = 'Approved') and
(category_charlie = 0 or status_charlie = 'Approved');
答案 1 :(得分:0)
或者,如果您只想使用状态名称:
SELECT *
FROM @sample_table
where Status_Alpha in ('Open','Approved') and Status_Beta in ('Open','Approved') and Status_Charlie in ('Open','Approved')
and (Status_Alpha = 'Approved' or Status_Beta = 'Approved' or Status_Charlie = 'Approved');