I have ONE table, contains a clientID and a subclientID, how to filter this to retrun clients that contain BASE and 1 ONLY. In this case, I would like to return client 46
| clientID | subclientID |
|---|---|
| 44 | 1 |
| 44 | 9 |
| 44 | BASE |
| 44 | 2 |
| 45 | BASE |
| 45 | 2 |
| 46 | BASE |
| 46 | 1 |
| 46 | 1 |
EDIT: subclient may contains duplicates
Advertisement
Answer
Here’s one way of finding that:
select clientid
from (
select clientid,
case when subclientid in ('BASE', '1') then 1 else 2 end as score
from test
) x
group by clientid
having sum(score) = 2;
Explanation
select clientid,
case when subclientid in ('BASE', '1') then 1 else 2 end as score
from test
will change BASE and 1 to the score 1. Everything else will be given score 2. The result will be like this:
clientid | score
-------: | -----:
44 | 1
44 | 2
44 | 1
44 | 2
45 | 1
45 | 2
46 | 1
46 | 1
Then, for each clientid we sum up the score. If the score is exactly 2, we know we want that client id.
Examples
- https://dbfiddle.uk/?rdbms=postgres_14&fiddle=1f845cfbb15657283c6758c186daf1c3
- https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=3984ebea44659fee444f1502ecd5ee61
- https://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=3984ebea44659fee444f1502ecd5ee61
Edit – if you have duplicates
If you have duplicates, you can use this:
select clientid
from (
select clientid,
case when subclientid in ('BASE', '1') then 1 else 2 end as score
from (select distinct clientid, subclientid from test) t
) x
group by clientid
having sum(score) = 2;
Example: https://dbfiddle.uk/?rdbms=postgres_14&fiddle=29590e13e0603bc675167950da05114b