行列转换--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、建立表格
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来实现
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 ('语文','数学','物理'));
二, 列转行
name varchar2(20),
chinese number(3),
math number(3),
physics number(3)
);
insert into tb2 select * from tb pivot(max(grade) for class in ('语文','数学','物理'));