I have 2 tables like this:
table_a
x
id col2
1 A
1 B
2 A
2 B
3 B
table_b
id col1
1 X
2 Y
3 Z
I want to join both the tables such that the resultant contains the repeating row values in col2 of table_a as columns. Each ID will not contain more than 3 table_a.col2 values. In this example, the result table would look like this :
result:
id col1 col2 col3 col 4
1 X A B null
2 Y A B null
3 Z B null null
How can I achieve this? I know I can use the listagg() to aggregate all the rows into one column like this :
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;
This would give me a result like this :
id col1 col2
1 X A_B
2 Y A_B
3 Z B
Advertisement
Answer
You can use conditional aggregation:
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;