sql - 多行转为一行 Oracle SQL

标签 sql oracle oracle11g

我有下表

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;

为了处理可变数量的列,我可以想到三种解决方案:

  1. 放入足够的列来处理您的数据(合理的最大值)。
  2. 使用动态 SQL(在 PL/SQL 中立即执行)。
  3. 或者,将它们组合成一列。

这是最后一种方法:

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/

相关文章:

java - Oracle数据泵导出错误 "invalid argument value"

java.sql.SQLException : OALL8 is in an inconsistent state on JBoss 6. 1 EAP

sql - 如何将水平行转换为垂直 SQL Server

java - hibernate createQuery() 准备语句

java - Hibernate异常: java. lang.ClassNotFoundException : oracle. jdbc.OracleDriver

oracle - 如何在Oracle View 中添加 'WITH READ ONLY'约束

sql - 比较多个值 SQL

sql - 从 Azure 中的现有表创建空 SQL 表

Oracle 查询 - 优化

c# - 如何在 C# 中从 Oracle SQL Developer 检索 'Other Users' 的列表?