Each row has an Id and a Category Presence/Status combo. Sample code:
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');