Each row has an Id and a Category Presence/Status combo. Sample code:
x
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;
Produces:
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
So each row can have an “Alpha” (true/false) and a corresponding Status for “Alpha” (Pending, Approved, etc.). The same for the other categories (Beta and Charlie). Categories that are vacant always have a status of “Open”. For example, row with Id=1 has Category_Beta=0 (False), so corresponding Status_Beta is “Open”.
I have provided 3 categories in the example (Alpha, Beta, Charlie), but my actual data has over 40 categories. I want to find rows where ALL non-vacant categories are “Approved”. In the provided example, this would be rows 1 and 4.
Advertisement
Answer
This would just be a complicated where
clause:
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');