需要将行转换为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的列的主要内容,如果未能解决你的问题,请参考以下文章

将行转换为列 Oracle

将行值转换为火花数据框中的列数组

将行拆分为多行 Oracle

将行数传递给Oracle中的列[重复]

如何将行转换为按行数创建标题的列

带有条件的 Oracle SQL Pivot 将行转换为列