Вам нужен подзапрос, чтобы удалить дубликаты, что-то типа;
select id, listagg(name, ',') within group (order by name) as names
from (
select id, name1 as name from your_table
union
select id, name2 as name from your_table
union
select id, name3 as name from your_table
)
group by id
union
автоматически удаляет дубликаты из объединенного набора результатов (если вы не хотите, чтобы это, вы будете использовать union all
).
В демо с КТР, представляющий таблицу:
with your_table(id, name1, name2, name3) as (
select 1, 'a', 'b', 'c' from dual
union all select 1, 'c', 'd', 'a' from dual
union all select 2, 'd', 'e', 'a' from dual
union all select 2, 'c', 'd', 'b' from dual
)
select id, listagg(name, ',') within group (order by name) as names
from (
select id, name1 as name from your_table
union
select id, name2 as name from your_table
union
select id, name3 as name from your_table
)
group by id;
ID NAMES
-- --------------------
1 a,b,c,d
2 a,b,c,d,e
Вы также можете иметь подзапрос выбирающий все три колонки, а затем поворачиваясь их в ряды, но только с тремя, это может быть проще.
Спасибо Алекс. Я не знаю, почему я не думал об этом раньше. Это сработало! – Cindy