使用oracle 11g中的pivot将行转换为列

时间:2014-03-25 05:09:17

标签: sql oracle oracle11g

我想使用PIVOT函数将行转换为列。

示例如下

EMP No   EMP Name
-------  --------
1         ABC
2         PQR

输出应为

Col1         Col2
----         ----
Emp No         1
Emp Name       ABC
EMP No          2
Emp Name       PQR

我对循环没问题然而我们应该使用PIVOT,但是谷歌没有得到任何匹配。

请建议并发送一些示例代码。

2 个答案:

答案 0 :(得分:1)

实际上,根据您的要求,您需要unpivot,而不是pivot。但为此,两列的数据类型应该相同,在这种情况下为字符

with tab(emp_no, emp_name) as (
select '1' ,'abc' from dual union all
select '2' ,'PQR' from dual)
----
--End of Data Perparation
----
select * 
  from tab
unpivot (col2 for col1 in ( emp_no as 'EMP No', emp_name as 'Emp Name'));

输出

|     COL1 | COL2 |
|----------|------|
|   EMP No |    1 |
| Emp Name |  abc |
|   EMP No |    2 |
| Emp Name |  PQR |

答案 1 :(得分:0)

我不确定是否可以使用PIVOT完成此操作。您可以单独选择列并UNION它们。

select 'Emp No' col1, emp_no col2 from tab
union all
select 'Emp Name', emp_name from tab;

请注意,两列的数据类型应相同。否则你需要转换/转换其中一个。

此外,结果可能不是您想要的顺序。您需要明确地指定order by子句。

select col1, col2 from(
    select 'Emp No' col1, emp_no col2, emp_no from tab
    union all
    select 'Emp Name', emp_name, emp_no from tab
    )
order by emp_no, case col1 when 'Emp No' then 1 else 2 end;

sqlfidle