Mibi
Mibi

Reputation: 298

Finding missing values in aggregated list Oracle SQL

I have a table similar to this

ID Value
A AA
A AC
B AB
B AD

This table is grouped by ID and I get a list of values

SELECT ID, LISTAGG(value, ', ') WITHIN GROUP (ORDER BY value)
  FROM table 
 GROUP BY ID

All possible values are AA, AB, AC, AD. I would like to show the missing values. So the results should be

ID Value
A AB, AD
B AA, AC

Is there any elegant way to solve this? I am working on oracle 19

Upvotes: 1

Views: 218

Answers (1)

MT0
MT0

Reputation: 167822

You can find all the DISTINCT values and then use a PARTITIONed OUTER JOIN to find the missing ones:

SELECT t.id,
       LISTAGG(v.value, ', ') WITHIN GROUP (ORDER BY v.value) AS missing
FROM   (SELECT DISTINCT VALUE FROM table_name) v
       LEFT OUTER JOIN table_name t
       PARTITION BY (t.id)
       ON (v.value = t.value)
WHERE  t.value IS NULL
GROUP BY t.id;

Which, for the sample data:

CREATE TABLE table_name (ID, VALUE) AS
SELECT 'A', 'AA' FROM DUAL UNION ALL
SELECT 'A', 'AC' FROM DUAL UNION ALL
SELECT 'B', 'AB' FROM DUAL UNION ALL
SELECT 'B', 'AD' FROM DUAL;

Outputs:

ID MISSING
A AB, AD
B AA, AC

db<>fiddle here

Upvotes: 5

Related Questions