Преобразование строк в несколько столбцов - PullRequest
0 голосов
/ 24 января 2020

у меня есть таблица с 4 столбцами ID, ROL_NUM, NAME, DEPT и с записями, как показано ниже:

ID          ROL_NUM     NAME        DEPT
1           1           Rajasekar   CSE
1           1           Bala        CSE
1           1           Poo         IT
1           1           bhasker     CSE

Мне нужен вывод из этой таблицы следующим образом

ID          ROL_NUM             NAME                DEPT            NAME            DEPT            NAME            DEPT            NAME            DEPT
1           1                   Rajasekar           CSE             Bala            CSE             Poo             It              bhasker         CSE

Кто-то предоставит запрос или поможет мне, предоставив запрос.

Ответы [ 3 ]

0 голосов
/ 24 января 2020
SELECT
ID,
ROL_NUM,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 1) NAME,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 2) DEPT,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 3) NAME,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 4) DEPT,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 5) NAME,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 6) DEPT,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 7) NAME,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 8) DEPT
from (SELECT ID
      ,ROL_NUM
      ,LISTAGG(NAME || ',' ||DEPT,',') WITHIN GROUP (ORDER BY ID) AS NAMEDEPT
FROM TABLE1
GROUP BY ID,ROL_NUM);

Выход

ID  ROL_NUM NAME    DEPT    NAME    DEPT    NAME        DEPT    NAME    DEPT
1   1       Bala    CSE     Poo     IT      Rajasekar   CSE     bhasker CSE

DEMO:

http://sqlfiddle.com/#! 4 / beb53 / 19

0 голосов
/ 24 января 2020

Следующий запрос может вам помочь.

select
   id,
         rol_num,
   substr(SYS_CONNECT_BY_PATH(name, ','),2) name_list
from
   (
   select
     id,
         rol_num,
     name,
     count(*) OVER ( partition by id) cnt,
     ROW_NUMBER () OVER ( partition by id order by name) seq
   from test where id is not null)
where
   seq=cnt
start with
   seq=1
connect by prior
   seq+1=seq
and prior id=id;

Вывод

ID    ROL_NUM      NAME_LIST
1        1         Bala,Rajasekar

Аналогично, вы можете добавить dept_list.

0 голосов
/ 24 января 2020

Вы можете использовать условное агрегирование для такого поворота:

select ID, rol_num, max( case when rn = 1 then name end ) as name1,
                    max( case when rn = 1 then dept end ) as dept1,
                    max( case when rn = 2 then name end ) as name2,
                    max( case when rn = 2 then dept end ) as dept2,
                    max( case when rn = 3 then name end ) as name3,
                    max( case when rn = 3 then dept end ) as dept3,
                    max( case when rn = 4 then name end ) as name4,
                    max( case when rn = 4 then dept end ) as dept4                    
  from
  (
  select t.*, row_number() over (order by t.name) as rn
    from tab t
   order by t.name 
  )
  group by ID, rol_num  

Демо

...