一、 列 转 行
create table STU_ROW2COL
(
id VARCHAR2(10),
intname VARCHAR2(10),
subject VARCHAR2(20),
grade NUMBER
)
insert into stu_row2col (ID, INTNAME, SUBJECT, GRADE) values ('1', 'ZORRO', '语文', 70);
insert into stu_row2col (ID, INTNAME, SUBJECT, GRADE) values ('2', 'ZORRO', '数学', 80);
insert into stu_row2col (ID, INTNAME, SUBJECT, GRADE) values ('3', 'ZORRO', '英语', 75);
insert into stu_row2col (ID, INTNAME, SUBJECT, GRADE) values ('4', 'SEKER', '语文', 65);
insert into stu_row2col (ID, INTNAME, SUBJECT, GRADE) values ('5', 'SEKER', '数学', 75);
insert into stu_row2col (ID, INTNAME, SUBJECT, GRADE) values ('6', 'SEKER', '英语', 60);
insert into stu_row2col (ID, INTNAME, SUBJECT, GRADE) values ('7', 'BLUES', '语文', 60);
insert into stu_row2col (ID, INTNAME, SUBJECT, GRADE) values ('8', 'BLUES', '数学', 90);
insert into stu_row2col (ID, INTNAME, SUBJECT, GRADE) values ('9', 'PG', '数学', 80);
insert into stu_row2col (ID, INTNAME, SUBJECT, GRADE) values ('10', 'PG', '英语', 90);
SQL> select t.* from stu_row2col t ;
ID INTNAME SUBJECT GRADE
---------- ---------- -------------------- ----------
11 ZORRO 语文 77
1 ZORRO 语文 70
2 ZORRO 数学 80
3 ZORRO 英语 75
4 SEKER 语文 65
5 SEKER 数学 75
6 SEKER 英语 60
7 BLUES 语文 60
8 BLUES 数学 90
9 PG 数学 80
10 PG 英语 90
想要实现行专列, 就是输出结果是这样的:
SQL> select * from ( select t.intname,t.subject,t.grade from stu_row2col t)
pivot(sum(grade) for subject in ('语文' 语文,'数学' 数学,'英语' 英语)) ;
INTNAME 语文 数学 英语
---------- ---------- ---------- ----------
SEKER 65 75 60
BLUES 60 90
PG 80 90
ZORRO 147 80 75
二、 行 转 列
创建一个视图:
create or replace view stu_col2row as
select "INTNAME","语文","数学","英语" from ( select t.intname,t.subject,t.grade from stu_row2col t) pivot(sum(grade) for subject in ('语文' 语文,'数学' 数学,'英语' 英语));
SQL> select INTNAME 姓名,km 科目, fs 分数 from stu_col2row unpivot(fs for km in(语文,数学,英语));
姓名 科目 分数
---------- ---- ----------
SEKER 语文 65
SEKER 数学 75
SEKER 英语 60
BLUES 语文 60
BLUES 数学 90
PG 数学 80
PG 英语 90
ZORRO 语文 70
ZORRO 数学 80
ZORRO 英语 75