I have following table in Postgres
| phone | group | spec | | 1 | 1 | 'Lock' | | 1 | 2 | 'Full' | | 1 | 3 | 'Face' | | 2 | 1 | 'Lock' | | 2 | 3 | 'Face' | | 3 | 2 | 'Scan' |
Tried this
SELECT phone, string_agg(spec, ', ') FROM mytable GROUP BY phone;
Need this ouput for each phone where there is empty string for missing group.
| phone | spec | 1 | Lock, Full, Face | 2 | Lock, '' , Face | 3 | '', Scan ,''
Advertisement
Answer
You need a CTE which returns all possible combinations of phone and group and a left join to the table so you can group by phone:
with cte as (
  select * 
  from (
    select distinct phone from mytable   
  ) m cross join (
    select distinct "group" from mytable  
  ) g 
)  
select c.phone, string_agg(coalesce(t.spec, ''''''), ',') spec
from cte c left join mytable t
on t.phone = c.phone and t."group" = c."group"
group by c.phone
See the demo.
Results:
| phone | spec | | ----- | -------------- | | 1 | Lock,Full,Face | | 2 | Lock,'',Face | | 3 | '',Scan,'' |