选择列作为行 Oracle SQL?

Selecting Columns as rows Oracle SQL?

我有 table(医疗发票)与 5 个外键连接
每一行都有一个这样的 FK 值:

    ID   PDL_ID   LTT_ID   MSF_ID   RIY_ID   ORN_ID   AMOUNT
    1    null     1        null     null     null     20.00
    2    null     null     1        null     null     15.00
    3    1        null     null     null     null     10.00
    4    null     null     3        null     null     18.00

我想要这样的结果

    col1(IDs)  col2(values)   col3(Amount)   
    PDL_ID      1             10
    LTT_ID      1             20
    MSF_ID      1             15
    MSF_ID      3             18

一个简单的方法是使用 union all:

select t.*
from ((select 'POL_ID' as col1, POL_ID as col2, Amount from invoices
      ) union all
      (select 'LTT_ID' as col1, LTT_ID as col2, Amount from invoices
      ) union all
      (select 'MSF_ID' as col1, MSF_ID as col2, Amount from invoices
      )
     ) t
where col2 is not null; 

如果您有大量数据,还有其他方法不需要阅读每一列的 table。

在 Oracle 11g 及更高版本中,您可以使用运算符 unpivot:

select col1, col2, amount from invoice
  unpivot (col2 for col1 in ("PDL_ID", "LTT_ID", "MSF_ID", "RIY_ID", "ORN_ID"))

SQLFiddle demo