как пропустить первую и последнюю запятую при использовании функции sys_connect_by_path в оракуле? - PullRequest
2 голосов
/ 06 марта 2012

так что это мой стол -

create table student
(
stu_id int,
s_name nvarchar(max),
s_subject nvarchar(max),
marks varchar(20)
)

и значения

insert into student values(123,'pammy','English','88');
insert into student values(123,'pammy','Maths','56');
insert into student values(124,'watts','Biology','98');
insert into student values(125,'Tom','Physics','90');
insert into student values(125,'Tom','Computer','95');
insert into student values(125,'Tom','ED','75');

так что я сделал это извлеченные данные, которые произошли трижды. и затем объединяет строковые значения, используя sys_connect_by_path. Мой код -

 select stu_id,s_name,
max(sys_connect_by_path(s_subject, ', ' )) s_subject,
max(sys_connect_by_path(marks, ', ' )) marks

    from (select stu_id,s_name,s_subject,marks, 
                    row_number() over 
                   (partition by stu_id order by s_subject) rn
             from student
               )
   start with rn = 1
    connect by prior rn = rn-1 and prior stu_id = stu_id
    group by stu_id,s_name
having stu_id in ( select stu_id 
                    from student
                    group by stu_id 
                    having count(stu_id) >3 )
  order by stu_id,s_name

вывод моего кода -

stu_id      s_name  s_subject              marks
125         Tom     ,Physics,Computer,ED,    ,90,95,75,

код работает отлично, но я использую запятую как разделитель, и я просто хочу избавиться от запятой в начале и в конце. в столбце s_subject.

что я хочу это

stu_id s_name s_subject marks 125 Tom Physics, Computer, ED 90,95,75

Я попробовал обрезать функцию, но не смог добиться успеха. Я могу установить соединение sys по пути, если мои данные фиксированы, но здесь данные не фиксированы. Так что, пожалуйста, помогите ..

Ответы [ 3 ]

2 голосов
/ 06 марта 2012

Вот как я это сделаю в Oracle 11.2:

SQL> select stu_id, s_name,
  2      listagg(s_subject, ', ' ) within group (order by s_subject) s_subject,
  3      listagg(marks, ', ' ) within group (order by s_subject) marks
  4  from student
  5  group by stu_id, s_name;

STU_ID S_NAME          S_SUBJECT                 MARKS
------ --------------- ------------------------- ---------------
   123 pammy           English, Maths            88, 56
   124 watts           Biology                   98
   125 Tom             Computer, ED, Physics     95, 75, 90

Обратите внимание, что я упорядочил оба списка по темам, поэтому порядок соответствует каждому столбцу списка.

1 голос
/ 06 марта 2012
SQL>  select stu_id
  2        , s_name
  3        , ltrim(max(sys_connect_by_path(s_subject, ', ' )),', ') s_subject
  4        , ltrim(max(sys_connect_by_path(marks, ', ' )),', ') marks
  5     from ( select stu_id
  6                 , s_name
  7                 , s_subject
  8                 , marks
  9                 , row_number() over (partition by stu_id order by s_subject) rn
 10              from student
 11          )
 12    where level >= 3
 13    start with rn = 1
 14  connect by prior rn = rn - 1
 15      and prior stu_id = stu_id
 16    group by stu_id
 17        , s_name
 18  /

    STU_ID S_NAME     S_SUBJECT                      MARKS
---------- ---------- ------------------------------ --------------------
       125 Tom        Computer, ED, Physics          95, 75, 90

1 row selected.

С уважением,
Роб.

PS: Спасибо и +1 за предоставление оператора создания таблицы и операторов вставки.

0 голосов
/ 06 марта 2012
substr( max(sys_connect_by_path(s_subject, ', ' )),
    2, 
    length(max(sys_connect_by_path(s_subject, ', ' ))-1 )
...