I had most of this query down until a new condition arose and it has confounded me. Given the following simplified table schema:
Parent Table:
ID
FName
LName
Child Table:
[Index]
ParentID
Active_Flag
ExpirationDate
What I want to do is get Parent rows for which:
- There are no children.
- There are children whose Active_Flag is 1 but whose expiration dates are blank or NULL.
- There are indeed children but none have the Active_Flag set to 1.
The following query came up with my first two criteria:
SELECT p.ID, p.LNAME, p.FNAME,
CASE
WHEN COUNT(ct.indx) = 0 THEN 'None'
WHEN ct.ExpirationDate is NULL or ct.ExpirationDate = '' THEN 'No expiration date'
END AS Issue
FROM ParentTable AS p
LEFT JOIN ChildTable ct
ON p.ID = ct.ParentID
GROUP BY p.ID, p.LNAME, p.FNAME, ct.[INDEX], ct.ExpirationDate
HAVING (COUNT(ct.[INDEX]) = 0) OR (ct.ExpirationDate IS NULL OR ct.ExpirationDate = '')
ORDER BY p.LNAME
I don’t know how to account for #3. Any help is appreciated. Thanks in advance.
You can also do this in the HAVING clause:
The DISTINCT in the SELECT is redundant. You do not need it with an aggregation.
You can simplify the having to “sum(ActiveFlag)” if the activeFlag is indeed an integer. If not, then it should be “= ‘1’” rather than “= 1′.