У меня есть таблица, как показано ниже

-------------
ID   | NAME | DEFAULT
-------------
1001 | A    | yes
1001 | B    |no
1001 | C    |no
1002 | D    |no
1002 | E    |yes
1002 | F    |no
1003 | C    |yes
1003 | E    |no
1003 | G    |
-------------

Я хочу достичь нижеперечисленного

ID   | NAME  | DEFAULT
----------------------
1001 | A,B,C | A
1002 | D,E,F | E
1003 | C,E,G | C
-------------

Как я могу этого добиться? Я новичок в plsql. Пожалуйста, помогите

Я пробовал это

select id,LISTAGG(name, ', ') WITHIN GROUP (ORDER BY id),CASE default WHEN  yes THEN name END as "default" from table_name
0
Swapnil Shende 22 Сен 2020 в 01:31

1 ответ

Лучший ответ
  1. Вам необходимо агрегировать строки в столбце NAME, поэтому listagg < / a> твое.
  2. Вам нужно выбрать одно значение из столбца NAME, где DEFAULT - «да», поэтому выберите его с помощью case / декодировать и объединить с любой функцией.
select
  id
  , listagg(name, ',') within group(order by name asc) as name
  , min(decode(lower(default), 'yes', name)) as default
from yourtable
group by id
1
astentx 21 Сен 2020 в 22:51