I have a table with App name, server name and source of that record (3 unique sources). Table can contain same app name, server name but different source for any record, and also sometimes for an app it can be present in one source and not in other. Now I want to find out records for three scenarios. I am trying to use except but not working, can someone give me query for this.
Table
| app | server | source |
|---|---|---|
| abc | 123 | A |
| abc | 123 | B |
| abc | 123 | C |
| def | 456 | A |
| def | 456 | B |
| ghi | 789 | A |
| jkl | 012 | B |
| jkl | 012 | C |
Scenarios: server in
| src A | src B | src C | Action |
|---|---|---|---|
| Yes | Yes | Yes | No action |
| Yes | No | No | add to B |
| Yes | Yes | No | add to C |
| No | Yes | Yes | remove from B and C |
Expected Output: No need to display abc 123 as it is present in all 3 sources
| app | server | action |
|---|---|---|
| def | 456 | add to C |
| ghi | 789 | add to B |
| jkl | 012 | remove from B and C |
CodePudding user response:
You can group by app and server and proceed exactly like you describe:
SELECT app, server
CASE
WHEN has_a AND has_b AND has_c
THEN 'No action'
WHEN has_a AND NOT has_b AND NOT has_c
THEN 'add to B'
WHEN has_a AND has_b AND NOT has_c
THEN 'add to C'
WHEN NOT has_a AND has_b AND has_c
THEN 'remove from B and C'
END AS action
FROM (SELECT app, server,
bool_or(source = 'A') AS has_a,
bool_or(source = 'B') AS has_b,
bool_or(source = 'C') AS has_c
FROM tab
GROUP BY app, server) AS grouped;
Note that action will be NULL for those cases not mentioned in your question.
