sql—在oracle中将具有多行的单列转换为多列

c9x0cxw0  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(387)

我有一个表,其中有一列名为combined\ u data,如下所示:-

组合数据

101
山姆
印度
102
岩石
美国
103
迈克尔
俄罗斯
我需要输出like:-

id fname国家

101山姆印度
102 rock美国
103迈克尔俄罗斯
我怎样才能做到这一点?尝试使用pivot,但它获取最小和最大记录,所以我只得到2行我需要的所有行。。。

ufj5ltwl

ufj5ltwl1#

只需给行编号,预先计算每一行和每一列的索引,然后将它们放在一起。

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小提琴。

相关问题