#sql #oracle
#sql #Oracle
Вопрос:
У меня есть таблица, как показано ниже
-------------
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
Комментарии:
1. взгляните на функцию listagg — docs.oracle.com/cd/E11882_01/server.112/e41084/… Это не pl / sql, просто прямой oracle sql. Pl / sql — это язык программирования.
2. @OldProgrammer Я попробовал это и успешно получил столбец id, name, но не смог получить столбец по умолчанию
Ответ №1:
- Вам нужно объединить строки в столбце NAME, поэтому listagg ваш.
- Вам нужно выбрать одно значение из столбца NAME, где ПО умолчанию установлено значение «да», поэтому выберите его с помощью case / decode и агрегируйте с любой функцией.
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