行列转换

来源:互联网 发布: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          职员

原创粉丝点击