需要帮助使用sql join将行转换为列(Oracle 9i)

时间:2010-08-05 23:17:11

标签: oracle join formatting plsql

我有一个表格,其中包含22列和6-7,000行,格式如下

Seq_num     unique_id   name  ...   
------------------------------------
1          1           abc                  
1          1           cde      
2          1           lmn          
2          1           opq      
3          1           pqr      
4          1           stu      
1          2           oaq      
2          2           zxq      
3          2           fgw      
3          2           pie      
4          2           tie      

我正在尝试将每个unique_id的4个连续序列转换为单行 看起来像

unique_id   name    ...     name    ...     name    ...     name    ... 
--------------------------------------------------------------------------
1           abc             lmn             pqr             stu
2           oaq             zxq             fgw             tie

我使用unique_Id和seq_num上的分区以及左连接来实现此目的。

但是,我需要以下列格式从表中获取所有数据

unique_id   name    ...     name     ...    name    ...     name     ...  
---------------------------------------------------------------------------
1           abc             lmn             pqr             stu
1           cde             opq             pqr             stu
2           oaq             zxq             fgw             tie
2           oaq             zxq             pie             tie

即。我需要在另一行(对于给定的unique_id)显示唯一的seq_num,如果缺少任何seq_num, 使用常见的seq_num(来自相同的unique_id)填写空白..

例如。

由于unique_id 2有两个seq_num 3(fgw,pie),unique_id 2将有两行看起来像

2           oaq             zxq             fgw             tie
2           oaq             zxq             pie             tie 

这样的事情是可能的,如果 那怎么样?

我正在使用Oracle 9i。

谢谢,
R. Paul

2 个答案:

答案 0 :(得分:0)

所以,你需要填补缺失的空白。以下代码不能按预期工作。思考......

以下代码是WIP。这是生成一整套SEQ_NUM,UNIQUE_ID和NAME列的第一步,但我还没有机会测试它。

select seq_num
       , unique_id
       , case 
            when name is not null then name 
            else lag (name, 1) 
               over ( partition by unique_id, seq_num 
                      order by nvl2(name, 1, 0)
                    ) end as name
from
    (    
        select t.seq_num
               , y.unique_id
               , y.name
        from ( select 1 as seq_num from dual
               union all
               select 2 as seq_num from dual
               union all
               select 3 as seq_num from dual
               union all
               select 4 as seq_num from dual ) t
        left outer join
             your_table y 
                 on ( t.seq_num = y.seq_num )   
    )

NB - 我本可以选择使用CONNECT BY技巧来生成数字,但这在9i中有点不稳定(并且也没有记录)。

答案 1 :(得分:0)

不是答案,而是要求澄清。在您的示例中:

1           abc             lmn             pqr             stu
1           cde             opq             pqr             stu

您在第一行中将“abc”与“lmn”配对,在第二行中将“cde”与“opq”配对。以下行集也是有效的“解决方案”:

1           abc             opq             pqr             stu
1           cde             lmn             pqr             stu

第一行中“abc”与“opq”配对,第二行中“cde”与“lmn”配对?

如果是这样,我不确定你怎么知道你有一个有效的答案集,因为数据中似乎没有任何东西可以帮助你区分这两者。