oracle11g行列转换

http://luckysea.itpub.net/post/5481/457746

 在 Oracle 数据库 11g 推出之前,您需要针对每个值通过使用decode 函数或case语句进行列转换操作, 
并将每个不同的值编写为一个单独的列。但是,该方法不是很不直观也不是很方便。 


oracle11g可以使用一种很好的新特性PIVOT和UNPIVOT,通过一种新的操作符以交叉表格式显示任何查询, 
oracle为了实现更强大的数据仓库应用,在SQL和PL/SQL方面有很大的加强。 


--使用昨天建立的测试表 

C:Documents and SettingsAdministrator>sqlplus /nolog 

SQL*Plus: Release 11.1.0.6.0 - Production on 星期五 3月 21 09:16:11 2008 

Copyright (c) 1982, 2007, Oracle. All rights reserved. 

idle>conn / as sysdba 
已连接。 
PENG11G(sys)>desc vc_test; 
名称 是否为空? 类型 
----------------------------------------------------- -------- ------------------------------------
PNO VARCHAR2(6) 
PNAME VARCHAR2(10) 
SALARY NUMBER(10,2) 
PLEVEL VARCHAR2(3) 

PENG11G(sys)>select * from vc_test; 

PNO PNAME SALARY PLE 
------ ---------- ---------- --- 
000001 张三 1500 PG 
000002 李四 2500 SE 
000003 王五 4500 SE 
000004 周二 1500 PG 
000004 刘六 8500 SSE 
000006 待定 

已选择6行。 


PENG11G(sys)>select plevel, count(1) cnt 
2 from vc_test 
3 where plevel is not null 
4 group by plevel; 

PLE CNT 
--- ---------- 
SSE 1 
PG 2 
SE 2 

--我们将plevel转换成行 

PENG11G(sys)> select * from ( 
2 select plevel 
3 from vc_test t 
4 ) 
5 pivot 
6 ( 
7 count(plevel) 
8 for plevel in ('PG','SE','SSE') 
9 ) ; 

'PG' 'SE' 'SSE' 
---------- ---------- ---------- 
2 2 1 

--有 pivot 就应该有unpivot 

PENG11G(sys)>create table upv_test as 
2 select * from ( 
3 select plevel 
4 from vc_test t 
5 ) 
6 pivot 
7 ( 
8 count(plevel) 
9 for plevel in ('PG','SE','SSE') 
10 ) ; 

表已创建。 

PENG11G(sys)>desc upv_test; 
名称 是否为空? 类型 
----------------------------------------------------- -------- ---------------------- 
'PG' NUMBER 
'SE' NUMBER 
'SSE' NUMBER 

PENG11G(sys)>select * from upv_test; 

'PG' 'SE' 'SSE' 
---------- ---------- ---------- 
2 2 1 


PENG11G(sys)>select * 
2 from upv_test 
3 unpivot 
4 ( 
5 plevel_count 
6 for plevel in ("'PG'","'SE'","'SSE'") 
7 ) ; 

PLEVE PLEVEL_COUNT 
----- ------------ 
'PG' 2 
'SE' 2 
'SSE' 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值