选择列作为行 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"))
我有 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"))