2016-02-12 5 views
0

Вот как моя таблица выглядитОбъединение нескольких строк и столбцов данных в одной каскадной строки

ID Name1 Name2 Name3 
1 a  b  c 
1 c  d  a 
2 d  e  a 
2 c  d  b 

мне нужно одну строку за ID, имеющий отличный name1, Имя2, NAME3 в одной строке, разделенные запятыми строки.

ID Name 
1 a,c,b,d,c 
2 d,c,e,a,b 

Я попытался использовать listagg с четкими, но не в состоянии удалить дубликаты.

ответ

1

Вам нужен подзапрос, чтобы удалить дубликаты, что-то типа;

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   

Вы также можете иметь подзапрос выбирающий все три колонки, а затем поворачиваясь их в ряды, но только с тремя, это может быть проще.

+0

Спасибо Алекс. Я не знаю, почему я не думал об этом раньше. Это сработало! – Cindy

Смежные вопросы