行列转换--PIVOT与UNPIVOT

PIVOT用于将列值旋转为列名(即行转列),可以用聚合函数配合CASE语句实现

PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS

完整语法:

table_source

PIVOT(

聚合函数(value_column

FOR
        pivot_column

IN(<column_list>)

)

UNPIVOT用于将列明转为列值(即列转行),可以用UNION来实现

完整语法:

table_source

UNPIVOT(

value_column

FOR
        pivot_column

IN(<column_list>)

)

一、行转列

1、建立表格

 

create table tb(
name varchar(10),
class varchar(10),
grade number);
insert into tb values('张三','语文',74);
insert into tb values('张三','数学',83);
insert into tb values('张三','物理',93);
insert into tb values('李四','语文',74);
insert into tb values('李四','数学',84);
insert into tb values('李四','物理',94);

select * from tb;

name      class       grade

---------- ---------- -----------

张三       语文        74

张三       数学        83

张三       物理        93

李四       语文        74

李四       数学        84

李四       物理        94

 

2、利用case来实现

 

select 姓名,
max(case 课程 when '语文' then 分数 else 0 end)语文,
max(case 课程 when '数学' then 分数 else 0 end)数学,
max(case 课程 when '物理' then 分数 else 0 end)物理
from tb
group by 姓名;

姓名       语文        数学        物理

---------- ----------- ----------- -----------

李四        74          84          94

张三        74          83          93

 

3. 使用pivot函数(目前oracle11g支持这个函数了)

 select * from tb pivot(max(grade) for class in ('语文','数学','物理'));

 

二, 列转行

 

create table tb2(
 name varchar2(20),
 chinese number(3),
 math number(3),
 physics number(3)
);
insert into tb2 select * from tb pivot(max(grade) for class in ('语文','数学','物理'));
1. 使用unpivot函数(目前oracle11g支持这个函数了)

 

select name,grade from tb2 unpivot (grade for calss in (chinese,math,physics));

 

 

posted @ 2013-06-29 17:31  lottu  阅读(783)  评论(3编辑  收藏  举报