需要将行转换为oracle中相似ID的列
Posted
技术标签:
【中文标题】需要将行转换为oracle中相似ID的列【英文标题】:Need to transform the rows into columns for the similar ID's in oracle 【发布时间】:2010-04-10 01:59:11 【问题描述】:我需要将行转换为 oracle 中相似 ID 的列
例如 以下是我查询数据库时得到的结果
Col1 Col2 Col3
---- ---- ----
1 ABC Yes
1 XYZ NO
2 ABC NO
我需要把它转换成
Col1 Col2 Col3 Col4 Col5
---- ---- ---- ---- ----
1 ABC Yes XYZ No
2 ABC NO NULL NULL
请有人帮我解决这个问题
谢谢, 西夫
【问题讨论】:
您需要编辑您的帖子以使您的表格示例正确显示。那么也许我们可以告诉你你想做什么。 @Siva - 我对您的帖子进行了格式化以使其更具可读性,以便其他人更容易理解您想要实现的目标。你到底为什么要回滚我的更改? 【参考方案1】:基于AskTom:
select Col1,
max( decode( rn, 1, Col2 ) ) Col_1,
max( decode( rn, 1, Col3 ) ) Col_2,
max( decode( rn, 2, Col2 ) ) Col_3,
max( decode( rn, 2, Col3 ) ) Col_4
from (
select Col1,
Col2,
Col3,
row_number() over (partition by Col1 order by Col2 desc nulls last) rn
from MyTable
)
group by Col1;
我无权访问 Oracle 数据库来测试它,但我认为这会奏效。如果每个 ID 可能有两个以上的记录,那么您可以使用相应的行号向选择原因添加更多行。
【讨论】:
【参考方案2】:一种解决方案是使用10g MODEL clause:
SQL> select col1
2 , col2
3 , col3
4 , col4
5 , col5
6 from t23
7 model
8 return updated rows
9 partition by ( col1 )
10 dimension by ( row_number() over ( partition by col1
11 order by col2 desc nulls last) rnk
12 )
13 measures (col2, col3, lpad(' ',4) col4, lpad(' ',4) col5)
14 rules upsert
15 (
16 col2 [0] = col2 [1]
17 , col3 [0] = col3 [1]
18 , col4 [0] = col2 [2]
19 , col5 [0] = col3 [2]
20 )
21 /
COL1 COL2 COL3 COL4 COL5
---------- ---- ---- ---- ----
1 ABC Yes ABC NO
2 XYZ NO
SQL>
对于此类解决方案,我们需要指定查询中的列数,这是一个不幸的事实。也就是说,在常规 SQL 中,没有机制可以确定表包含 COL1 = 1 的三行,因此我们需要七列,这并非不合理。对于在编码时枢轴值的数量未知的情况,始终存在动态 sql。
【讨论】:
感谢大家的宝贵回复。我已经使用您的输入 Agin 解决了这个问题,非常感谢以上是关于需要将行转换为oracle中相似ID的列的主要内容,如果未能解决你的问题,请参考以下文章