行列转换
来源:互联网 发布:mysql重启命令 编辑:程序博客网 时间:2024/04/20 00:35
1、固定列数的行列转换
如
create table grade
(student varchar2(20),
subject varchar2(20),
grade varchar2(5));
insert into grade values('student1','语文','80');
insert into grade values('student1','数学','70');
insert into grade values('student1','英语','60');
insert into grade values('student2','语文','90');
insert into grade values('student2','数学','80');
insert into grade values('student2','英语','100');
SQL> select * from grade;
STUDENT SUBJECT GRADE
-------------------- -------------------- -----
student1 语文 80
student1 数学 70
student1 英语 60
student2 语文 90
student2 数学 80
student2 英语 100
已选择6行。
SQL> select student,sum(decode(subject,'语文', grade,null)) "语文",
2 sum(decode(subject,'数学', grade,null)) "数学",
3 sum(decode(subject,'英语', grade,null)) "英语"
4 from grade
5 group by student;
STUDENT 语文 数学 英语
-------------------- ---------- ---------- ----------
student1 80 70 60
student2 90 80 100
2、不定列行列转换
SQL> create table t
2 (name varchar2(10),
3 honor varchar2(30));
表已创建。
SQL> insert into t values('A','销售经理');
已创建 1 行。
SQL> insert into t values('B','销售员');
已创建 1 行。
SQL> insert into t values('A','销售员');
已创建 1 行。
SQL> insert into t values('B','培训师');
已创建 1 行。
SQL> insert into t values('C','职员');
已创建 1 行。
SQL> insert into t values('A','高级工程师');
已创建 1 行。
SQL> select * from t;
NAME HONOR
---------- ---------------
A 销售经理
B 销售员
A 销售员
B 培训师
C 职员
A 高级工程师
已选择6行。
SQL> CREATE OR REPLACE FUNCTION get_honor(tmp_name varchar2)
2 RETURN VARCHAR2
3 IS
4 Col_honor VARCHAR2(4000);
5 BEGIN
6 FOR cur IN (SELECT honor FROM t WHERE name=tmp_name) LOOP
7 Col_honor := Col_honor||cur.honor;
8 END LOOP;
9 Col_honor := rtrim(Col_honor,1);
10 RETURN Col_honor;
11 END;
12 /
函数已创建。
SQL> select distinct name,get_honor(name) honor from t;
NAME HONOR
---------- ------------------------------
A 销售经理销售员高级工程师
B 销售员培训师
C 职员