如何在Oracle中将不同行的值转换为单行

时间:2017-09-16 08:03:26

标签: oracle

我需要从返回一行的不同行中选择数据。 我有这样的表:

SNO USEFUL COUNTER PINCODE SUBSNO    DATA                            REFERENCE
--- ------ ------- ------- ------    -----------------------------   ---------
 1    Y     null    504293  null     504293                             Sl.No 
 2    null  null    504293  null     1                                  null
 3    null  null    504293  null     iciseva00031                       null
 4    null  null    504293  null     SANTHOSH KUMAR                     null
 5    null  null    504293  null     SANTHOSH MANTHENA                  null
 6    null  null    504293  null     12-52  BRAHMAN WADA                null
 7    null  null    504293  null     ASIFABAD                           null
 8    null  null    504293  null     Andhra Pradesh                     null
 9    null  null    504293  null     9248859222                         null
10    null  null    504293  null     2                                  null
11    null  null    504293  null     WSGLDPL12415                       null
12    null  null    504293  null     SIDDHARTHA COMMUNICATIONS          null
13    null  null    504293  null     MASADE SATISH                      null
14    null  null    504293  null     HNO10-143POSTOFFICEROADBAPUNAGAR   null
                                     ASIFABADDISTKUMRAMBHEEMASIFABAD 
15    null  null    504293  null     ADILABAD                           null
16    null  null    504293  null     ANDHRA PRADESH                     null
17    null  null    504293  null     9059187009                         null

我必须返回这样的输出:

PINCODE SUBSNO USER          COMPANY       AGENT            ADDRESS CITY         STATE        PHONE
------- ------ ----          -------       -----            ------- ----         -----        -----
504293  1      iciseva00031  SANTHOSHKUMAR SANTHOSHMANTHENA 12-52   BRAHMAN WADA ASIFABAD  Andhra Pradesh 9248859222

请帮帮我。

1 个答案:

答案 0 :(得分:0)

  

“我必须像这样显示输出表:”

抓住那一行很容易(使用具有正则表达式支持的编辑器来帮助纠缠重复):

select t1.data as PINCODE
        , t2.data as SUBSNO
        , t3.data as USER
        , t4.data as COMPANY
        , t5.data as AGENT
        , t6.data as ADDRESS
        , t7.data as CITY
        , t8.data as STATE
        , t9.data as PHONE
 from ( select PINCODE, DATA from your_table where PINCODE = DATA ) t1                            
    left join ( select PINCODE, DATA from your_table where SNO = 2) t2
        on t2.pincode = t1.pincode                            
    left join ( select PINCODE, DATA from your_table where SNO = 3) t3
        on t3.pincode = t1.pincode                             
    left join ( select PINCODE, DATA from your_table where SNO = 4) t4
        on t4.pincode = t1.pincode                             
    left join ( select PINCODE, DATA from your_table where SNO = 5) t5
        on t5.pincode = t1.pincode                             
    left join ( select PINCODE, DATA from your_table where SNO = 6) t6
        on t6.pincode = t1.pincode                             
    left join ( select PINCODE, DATA from your_table where SNO = 7) t7
        on t7.pincode = t1.pincode                             
    left join ( select PINCODE, DATA from your_table where SNO = 8) t8
        on t8.pincode = t1.pincode                             
    left join ( select PINCODE, DATA from your_table where SNO = 9) t9
        on t9.pincode = t1.pincode           
where t1.pincode = '504293'
/

当然,这可能不是你需要的。毫无疑问,您希望拥有所有其他行 - sno >= 10。简单:只需根据需要为多个列重复上述过程。

备注即可。

  1. 您是否必须在投影中对列名进行硬编码?是。显示的值表没有属性类型指示符,因此无法知道列表示的内容。因此,您需要自己将缺少的智能注入查询中。
  2. 如果事实证明该表确实有一个属性类型列,您可以使用它来标记投影中的列吗?是的,但这意味着动态生成查询。
  3. 如果另一个PINCODE以不同的顺序保存列会怎样?您将如何判断?如果没有属性类型指示器,您不知道列应该是什么,您只需要进行示例输出所代表的假定优先级。
  4. 所有这些加入:性能不会太糟糕吗?是的,是的,它可能会。
  5. 不幸的是,没有简单的。优雅,高效的解决方案,因为源数据是车祸。

    这些通用数据存储表对于编写数据输入例程的开发人员来说很诱人。他们以非常简单的方式隐藏数据,而不必担心数据建模和所有繁琐的东西。此外,它还具有超强的灵活性和面向未来的特点。但他们实际上所做的就是填补了大量的技术债务,这些债务必须由需要获取数据的开发人员支付。