I have a table that contains references to clients impacted in a problem. The parent table contains the problem info, specifically the ProblemID (PbMID). Since one problem can affect multiple clients, we store the client impacted data in a child table. The child table contains an ID field for housekeeping, a PbMID field which foreign keys back to the parent table, and a Company field containing the text name of the client.
I have a requirement to pull all the problems were a SINGLE client was impacted. If I use DISTINCT, I get all single client rows, but I also get the FIRST row of a multi-client problem, which is not what I'm being asked for.
Here's the client impacted table example
ID | PbMID | Company |
1 | 1 | Company 1 | Valid
2 | 4 | Company 2 | Valid
3 | 6 | Company 3 | Valid
4 | 22 | Company 1 | Invalid
5 | 22 | Company 4 | Invalid
6 | 23 | Company 5 | Valid
7 | 24 | Company 6 | Valid
8 | 25 | Company 1 | Invalid
9 | 25 | Company 8 | Invalid
10 | 25 | Company 10 | Invalid
11 | 26 | Company 2 | Valid
12 | 27 | Company 4 | Valid
The rows marked INVALID would not be included, since they reflect multi-client problems.
So, ideally, the return would be:
ID | PbMID | Company |
1 | 1 | Company 1 | Valid
2 | 4 | Company 2 | Valid
3 | 6 | Company 3 | Valid
6 | 23 | Company 5 | Valid
7 | 24 | Company 6 | Valid
11 | 26 | Company 2 | Valid
12 | 27 | Company 4 | Valid
Any help would be greatly appreciated. SQL isn't my forte, so I've been trying to wrap my head around this with no luck.
Best Answer
You could use GROUP BY, HAVING and a Common Table Expression (CTE) to obtain the data.
The GROUP BY and HAVING provides all those PbMIDs that only impacted a single company. If you need PbMIDs that impacted n companies you could change the HAVING to HAVING =n where n is the required number of companies.
This can then be combined with a CTE to produce the final query below.