1.pivot 行轉列
pivot 用法:
select ... from ... pivot --> 注意:在from 與where 之間的關鍵字 (pivot_clause pivot_for_clause pivot_in_clause) where ... (1)pivot_clause:定義要進行聚集的列; (2)pivot_for_clause:定義要分組和轉置的列; (3)pivot_in_clause:定義限定結果的值的范圍。產生的每個值的聚集轉換為單獨一列。
pivot 注意事項:
(1).任何僅在pivot子句中引用的列,不能用在select 列表中;
(2).任何僅在pivot for 子句中引用的列,不能用在select 列表中;
(3).pivot 子句中的所有列都必須使用聚集函數。
1.1 示例:單個字段聚集
create table pivot_table as select * from (select t.job, t.deptno, t.sal from emp t) pivot(sum(sal) --pivot_clause 定義要進行聚集的列 for deptno --pivot_for_clause 定義要分組和轉置的列 in(10 dept_10, 20 dept_20, 30 dept_30)) --pivot_in_clause 定義限定結果集的值的范圍。產生的每個值的聚集轉換為單獨一列。

1.2 示例:多個字段聚集
--pivot 使用多個聚集 select * from (select t.job, t.deptno, t.sal from emp t) pivot(sum(sal) sal,count(sal) cnt for deptno in(10 dept_10, 20 dept_20, 30 dept_30)) where job in ('MANAGER','CLERK');

2.unpivot 列轉行
unpivot 用法:
select ... from ... pivot [include nulls|exclude nulls] (unpivot_clause unpivot_for_clause unpivot_in_clause) where ... (1)unpivot_clause: 定義表示反轉置值后的列名稱(列名對應的列值); (2)unpivot_for_clause: 定義反轉置查詢所得到列的列名稱(列名); (3)unpivot_in_clause: 定義要進行反轉置的已轉置列(不是值)的列表。
2.1 示例:列轉行 ,在unpivot_in_clause 中可以使用 as 使用別名
select * from (select * from pivot_table ) unpivot (sal_value for dept_column in (dept_10 as '10' ,dept_20,dept_30)); --使用別名

2.2 示例:(1) include nulls ; (2) 轉置數據類型需一致
--unpivot 列傳行 /* 使用unpivot函數,所有轉置列數據類型需要一致,這是UNPIVOT查詢執行上的一個限制, 否則會報錯:ora-01790 */ select * from (select to_char(empno) empno, t.ename, t.job, to_char(t.mgr) mgr, to_char(t.hiredate,'yyyy-mm-dd') hiredate, to_char(t.sal) sal, to_char(t.comm) comm, to_char(t.deptno) deptno from emp t where rownum = 1) unpivot include nulls(colnum_value for colnum_name in(empno,ename,job,mgr,hiredate,sal,comm,deptno)) ;

