oracle pivot / unpivot


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)) ;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM