Преобразование одного столбца, имеющего несколько строк, в несколько столбцов в oracle - PullRequest
1 голос
/ 14 июля 2020

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

Combined_data

101

SAM

INDIA

102

ROCK

USA

103

MICHAEL

RUSSIA

И МНЕ НУЖЕН ВЫХОД, КАК: -

ID FNAME COUNTRY

101 SAM INDIA

102 ROCK USA

103 МАЙКЛ РОССИЯ

Как я могу этого добиться? Пытался использовать pivot, но он извлекает минимальные и максимальные записи, поэтому я получаю только 2 строки, мне нужны все строки ...

1 Ответ

2 голосов
/ 14 июля 2020

Просто пронумеруйте свои строки, предварительно вычислите индекс каждой новой строки и столбца и сложите их вместе.

with combined_data (id,val) as (
  select 1, '101' from dual union all
  select 2, 'SAM' from dual union all
  select 3, 'INDIA' from dual union all
  select 4, '102' from dual union all
  select 5, 'ROCK' from dual union all
  select 6, 'USA' from dual union all
  select 7, '103' from dual union all
  select 8, 'MICHAEL' from dual union all
  select 9, 'RUSSIA' from dual
), n as (
  select id, val, row_number() over (order by id) - 1 as rn 
  from combined_data
), rc as (
  select id, val, mod(rn, 3) as c, (rn - mod(rn, 3))/ 3 as r 
  from n
)
select t1.val, t2.val, t3.val
from rc t1 join rc t2 using (r) join rc t3 using (r)
where t1.c = 0 and t2.c = 1 and t3.c = 2

ОБНОВЛЕНИЕ: решение, основанное на предложении pivot:

with combined_data (id,val) as (
  select 1, '101' from dual union all
  select 2, 'SAM' from dual union all
  select 3, 'INDIA' from dual union all
  select 4, '102' from dual union all
  select 5, 'ROCK' from dual union all
  select 6, 'USA' from dual union all
  select 7, '103' from dual union all
  select 8, 'MICHAEL' from dual union all
  select 9, 'RUSSIA' from dual
), n as (
  select id, val, row_number() over (order by id) - 1 as rn 
  from combined_data
), rc as (
  select val, mod(rn, 3) as c, (rn - mod(rn, 3))/ 3 as r 
  from n
)
select num, name, state from rc
pivot (min(val) for c in (0 num, 1 name, 2 state))
order by r

(Обратите внимание, что в rc CTE не должно быть столбца id. В противном случае это будет частью неявного group by, выполняемого предложением pivot.)

См. db fiddle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...