Oracle11g新特性:使用PIVOT/UNPIVOT进行行列转换
上一篇:Oracle11g SQLPLUS支持直接显示Blob数据 下一篇:Oracle11g新特性:只读表(read only table)

Oracle11g新特性:使用PIVOT/UNPIVOT进行行列转换

MS SQL Server 2005引入的pivot/unpivot关键字,对于行列转换确实非常的方便。所以Oracle11g也引入了这两个关键字,语法和SQL Server 2005的基本上差不错。

SQL> select * from sales;
 
PRODCUT       QUARTER     AMOUNT
--------
-- ---------- ----------
a                   1        100
a                   2        110
a                   3        130
a                   4        140
b                   1        210
b                   2        220
b                   3        230
b                   4        240

使用pivot转换显示:

SQL> select * from sales
 
2   pivot (sum(amount)
 
3  for quarter in
 
4  (1 as Q1,2 as Q2,3 as Q3,4 as Q4));
 
PRODCUT            Q1         Q2         Q3         Q4
--------
-- ---------- ---------- ---------- ----------
a                 100        110        130        140
b                 210        220        230        240

Unpivot则执行和pivot相反的转换

SQL> create table sales2
 
2  as
 
3  select * from sales
 
4  pivot (sum(amount)
 
5  for quarter in
 
6  (1 as Q1,2 as Q2,3 as Q3,4 as Q4));
 
Table created.
 
SQL> select * from sales2;
 
PRODCUT            Q1         Q2         Q3         Q4
--------
-- ---------- ---------- ---------- ----------
a                 100        110        130        140
b                 210        220        230        240
SQL> select * from sales2
 
2  unpivot
 
3   (amount
 
4  for quarter in (Q1 as 1,Q2 as 2,Q3 as 3,Q4 as 4));
 
PRODCUT       QUARTER     AMOUNT
--------
-- ---------- ----------
a                   1        100
a                   2        110
a                   3        130
a                   4        140
b                   1        210
b                   2        220
b                   3        230
b                   4        240

上述的例子都是根据一个列进行一次聚合的转换,实际上也可以根据多列进行多次聚合,更详细的语法,请参考Oracle官方文档。

本文网址:http://www.ningoo.net/html/2007/oracle11g_new_feature_pivot_unpivot.html

订阅到Google | 收藏到Del.icio.us | 推荐到鲜果

相关文章 随机文章

本文Tags: , ,

2 条评论


(Required)
(Required, will not be published)