加入2个表时的Oracle拆分重复行转换成列

问题描述 投票:1回答:1

我有2个表所示:

表-A

id  col2
1   A
1   B
2   A
2   B
3   B

表-B

id  col1
1    X
2    Y
3    Z

我想加入这两个表,使得所得包含表-A的列COL2重复行值。每个ID将不包含多于3个table_a.col2值。在这个例子中,结果表是这样的:

结果:

id col1 col2 col3 col 4
1   X    A    B    null
2   Y    A    B    null
3   Z    B    null null

我怎样才能做到这一点?我知道我可以使用LISTAGG(),以所有的行聚合到这样的一列:

 select b.id, b.col1,
 listagg(a.col2, '_') within group (order by a.col2) as col2
 from table_b b join
 table_a a
 on b.id = a.id
 group by b.id, b.col1;

这会给我这样的结果:

id col1 col2
1   X    A_B
2   Y    A_B
3   Z    B
sql oracle
1个回答
4
投票

您可以使用条件汇总:

select b.id, b.col1,
       max(case when seqnum = 1 then a.col2 end) as col2,
       max(case when seqnum = 2 then a.col2 end) as col3,
       max(case when seqnum = 3 then a.col2 end) as col4
 from table_b b left join
      (select a.*,
              row_number() over (partition by a.id order by a.col2) as seqnum
       from table_a a
      ) a
      on b.id = a.id
 group by b.id, b.col1;
© www.soinside.com 2019 - 2024. All rights reserved.