Oracle行列转换之pivot 和unpivot

1. 创建表

-- 创建表
create table STD_COURSE
(
student_name VARCHAR2(100),
course_name VARCHAR2(100),
score       NUMBER
);

comment on table STD_COURSE
 is '学生课程成绩表';

comment on column STD_COURSE.student_name
 is '学生姓名';
comment on column STD_COURSE.course_name
 is '课程名';
comment on column STD_COURSE.score
 is '分数';

2. 初始化数据

insert into std_course (STUDENT_NAME, COURSE_NAME, SCORE)
values ('张三', '语文', 113);
commit;
insert into std_course (STUDENT_NAME, COURSE_NAME, SCORE)
values ('张三', '数学', 124);
commit;
insert into std_course (STUDENT_NAME, COURSE_NAME, SCORE)
values ('张三', '英语', 143);
commit;
insert into std_course (STUDENT_NAME, COURSE_NAME, SCORE)
values ('张三', '计算机', 138);
commit;
insert into std_course (STUDENT_NAME, COURSE_NAME, SCORE)
values ('赵四', '语文', 82);
commit;
insert into std_course (STUDENT_NAME, COURSE_NAME, SCORE)
values ('赵四', '数学', 95);
commit;
insert into std_course (STUDENT_NAME, COURSE_NAME, SCORE)
values ('赵四', '英语', 125);
commit;
insert into std_course (STUDENT_NAME, COURSE_NAME, SCORE)
values ('赵四', '计算机', 101);
commit;
insert into std_course (STUDENT_NAME, COURSE_NAME, SCORE)
values ('王六', '语文', 150);
commit;
insert into std_course (STUDENT_NAME, COURSE_NAME, SCORE)
values ('王六', '数学', 134);
commit;
insert into std_course (STUDENT_NAME, COURSE_NAME, SCORE)
values ('王六', '英语', 122);
commit;
insert into std_course (STUDENT_NAME, COURSE_NAME, SCORE)
values ('王六', '计算机', 125);
commit;

3. 查看数据

SELECT a.* FROM std_course a;

图1

Oracle行列转换之pivot 和unpivot

列转行

pivot 函数实现, 将上面原始数据转成行

1. 语法

select * from 表 pivot( 

聚合函数处理需要计算的字段

for 循环字段名 ( 循环字段值, 以逗号间隔 ) 

)

2. 示例


SELECT *
 FROM std_course
PIVOT(SUM(SCORE)
  FOR COURSE_NAME IN('语文' AS 语文,
                     '数学' AS 数学,
                     '英语' AS 英语,
                     '计算机' AS 计算机));

3. 结果

图2

Oracle行列转换之pivot 和unpivot

行转列

unpivot函数实现

1. 语法

select * from 表 unpivot( 
自定义字段1
for 自定义字段2 ( 循环字段值, 以逗号间隔 ) 
)

-- 自定义字段1: 这里随便指定一个字段名,最好能反应数据含义的,
-- 自定义字段2: 这里随便指定一个字段名,最好能反应数据含义的

2. 示例

为了使用上面的数据, 先创建一个视图, 方便后面使用


CREATE OR REPLACE VIEW horizontal_result AS
SELECT *
 FROM std_course
PIVOT(SUM(SCORE)
  FOR COURSE_NAME IN('语文' AS 语文,
                     '数学' AS 数学,
                     '英语' AS 英语,
                     '计算机' AS 计算机));       

视图查询结果如下:

SELECT *
 FROM horizontal_result;

图3

Oracle行列转换之pivot 和unpivot

任务

将上面图3,还原成图1效果


SELECT *
 FROM horizontal_result UNPIVOT(分数 FOR 课程名 IN(语文, 数学, 英语, 计算机));

图4

Oracle行列转换之pivot 和unpivot

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章