oracle 11g 新特性——行列转换——pivot和unpivot
oracle 11g增加了两个行列转换的查询方式:Pivot 和 unpivot
下面举例说明其应用:
第一:行转列--pivot
SQL> select * from t;
YEARS MONTHS PRODUCT_NA SALES
---------- ---------- ---------- ----------
2008 1 A 1000
2008 1 B 1500
2008 2 A 2000
2008 2 B 3000
2008 2 C 1000
2008 3 A 3000
2008 1 A 120
已选择7行。
SQL> select * from t pivot(sum(sales) for product_name in ('A' A,'B' B,'C' C));
YEARS MONTHS A B C
---------- ---------- ---------- ---------- ----------
2008 2 2000 3000 1000
2008 1 1120 1500
2008 3 3000
如上述所示,通过使用pivot,实现了行列的汇总转换!
第二:列转行--unpivot
为了说明问题,先创建一个视图:
SQL> create or replace view pivot_t as
2 select * from t pivot(sum(sales) for product_name in ('A' A,'B' B,'C' C))
3 /
视图已创建。
SQL> select * from pivot_t;
YEARS MONTHS A B C
---------- ---------- ---------- ---------- ----------
2008 2 2000 3000 1000
2008 1 1120 1500
2008 3 3000
--列转行:
SQL> select * from pivot_t unpivot(sales for product_name in (A,B,C));
YEARS MONTHS P SALES
---------- ---------- - ----------
2008 2 A 2000
2008 2 B 3000
2008 2 C 1000
2008 1 A 1120
2008 1 B 1500
2008 3 A 3000
已选择6行。
如上所示,通过使用unpivot,又将行转列出来的结果集转换回来了!
点评:oracle 11g的这个新特性非常好用!省去了很多不必要的麻烦!