Вы можете развернуть столбцы и объединить их обратно:
select u.value, string_agg(distinct u.source, ',' order by u.source)
from data
cross join lateral (
values('col1', col1), ('col2', col2)
)as u(source,value)
group by u.value
order by u.value;
Онлайн-пример
В качестве альтернативы, если вы не хотите перечислять каждый столбец, вы можете преобразовать строку в значение JSON, а затем развернуть, что:
select x.value, string_agg(distinct x.source, ',' order by x.source)
from data d
cross join lateral jsonb_each_text(to_jsonb(d)) as x(source, value)
group by x.value
order by x.value;