Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите преобразовать вывод.  [new]
skiaser
Member

Откуда:
Сообщений: 15
Добрый день. помогите решить задачу. Есть набор записей, некоторые из которых отличаются только значением одного поля. Например, col2.

col1 | col2 | col3
=============
val1 | val2 | val3
val1 | val4 | val3
val5 | val6 | val7
val5 | val8 | val7
val5 | val9 | val7

Необходимо сократить вывод, поместив различающиеся значения через запятую.
СУБД Oracle 9i.

col1 | col2 | col3
==================
val1 | val2,val4 | val3
val5 | val6,val8,val9 | val7

Спасибо.
16 окт 08, 09:29    [6312844]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать вывод.  [new]
Elic
Member

Откуда:
Сообщений: 29990
RTFM ТОП №14
16 окт 08, 09:37    [6312860]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать вывод.  [new]
Добрый Э - Эх
Guest
ТОП популярных вопросов, SQL, PL/SQL, Вопрос №5 уже читал? Что-то не получилось? Возникли вполне конкретные вопросы?
16 окт 08, 09:39    [6312867]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать вывод.  [new]
Добрый Э - Эх
Guest
Хотя, если учесть, что тебе нужно собрать два поля, при этом исключив дубли, то может можно и запрос готовый нарисовать... :)
-- тестовые данные
with t as (
select 'val1' as col1, 'val2' as col2, 'val3' as col3 from dual union all
select 'val1' as col1, 'val4' as col2, 'val3' as col3 from dual union all
select 'val5' as col1, 'val6' as col2, 'val7' as col3 from dual union all
select 'val5' as col1, 'val8' as col2, 'val7' as col3 from dual union all
select 'val5' as col1, 'val9' as col2, 'val9' as col3 from dual 
)
--
--
-- запрос (отлично работает под 9i):
select col1,
       max(rtrim(ltrim(replace(replace(replace(sys_connect_by_path(decode(rn1,1,col2),','),',,',','||chr(0)),chr(0)||','),chr(0)),','),','))
          keep(dense_rank last order by level) as path_col2,
       max(rtrim(ltrim(replace(replace(replace(sys_connect_by_path(decode(rn2,1,col3),','),',,',','||chr(0)),chr(0)||','),chr(0)),','),','))
          keep(dense_rank last order by level) as path_col3
  from (
         select t.* , 
                row_number() over(partition by col1 order by null) as rn0,
                row_number() over(partition by col1, col2 order by col2) as rn1,
                row_number() over(partition by col1, col3 order by col3) as rn2
           from t
       )
 start with rn0 = 1
 connect by prior rn0 = rn0 - 1
        and prior col1 = col1
 group by col1
16 окт 08, 10:01    [6312989]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать вывод.  [new]
skiaser
Member

Откуда:
Сообщений: 15
Всем большое спасибо за помощь. Ссылки и примеры очень помогли.
16 окт 08, 12:28    [6314425]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить