我有下表
P_ID, PROGR, DATA
1 , 1 , 'DATO A'
1 , 2 , 'DATO B'
1 , 3 , 'DATO C'
2 , 1 , 'DATO D'
2 , 2 , 'DATO E'
3 , 1 , 'DATO G'
我想得到这个结果
P_ID, DATA , DATA_1 , DATA_2
1 , 'DATO A', 'DATO B', 'DATO C'
2 , 'DATO D', 'DATO E', NULL
3 , 'DATO G', NULL , NULL
这可以通过与同一个表进行左连接来完成,如下所示(不是确切的结果,而是作为示例)
select * from
(select * from MYTABLE where PROGR = 1) a
left join
(select * from MYTABLE where PROGR = 2) b
on a.P_ID = b.P_ID
left join
(select * from MYTABLE where PROGR = 3) c
on a.P_ID = c.P_ID;
问题是这个查询是固定的,如果某些P_ID得到PROGR = 4,则需要重写。我认为我需要制作一个过程,但我一直在尝试但没有成功。
提前致谢。
最佳答案
您可以使用条件聚合:
select t.pid,
max(case when t.progr = 1 then t.data end) as data_1,
max(case when t.progr = 2 then t.data end) as data_2,
max(case when t.progr = 3 then t.data end) as data_3
from mytable t
group by t.pid;
为了处理可变数量的列,我可以想到三种解决方案:
- 放入足够的列来处理您的数据(合理的最大值)。
- 使用动态 SQL(在 PL/SQL 中
立即执行
)。 - 或者,将它们组合成一列。
这是最后一种方法:
select t.pid, listagg(t.data, ', ') within group (order by t.progr)
from mytable t
group by t.pid;
关于sql - 多行转为一行 Oracle SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33015668/