Oracle 行列转换函数pivot使用

问题描述:

描述:在项目中,需要将表中日期数据行,用视图转列显示月报表

解决方案:

注意:多聚合必须重命名。
Oracle 行列转换函数pivot使用_第1张图片

create table pivottest(
主键 varchar2(50) default sys_guid() not null,
日期 varchar2(10),
学生姓名 varchar2(20),
学生分组 varchar2(10),
学号   varchar2(10)
)

insert into pivottest (主键,日期,学生姓名,学生分组,学号) values (sys_guid(),'01','张三','一组','001');
insert into pivottest (主键,日期,学生姓名,学生分组,学号) values (sys_guid(),'01','李四','一组','002');
insert into pivottest (主键,日期,学生姓名,学生分组,学号) values (sys_guid(),'01','王五','二组','003');
insert into pivottest (主键,日期,学生姓名,学生分组,学号) values (sys_guid(),'01','赵六','二组','004');
insert into pivottest (主键,日期,学生姓名,学生分组,学号) values (sys_guid(),'02','狗蛋','一组','005');
insert into pivottest (主键,日期,学生姓名,学生分组,学号) values (sys_guid(),'02','狗剩','一组','006');
insert into pivottest (主键,日期,学生姓名,学生分组,学号) values (sys_guid(),'02','狗狗','二组','007');
insert into pivottest (主键,日期,学生姓名,学生分组,学号) values (sys_guid(),'02','狗三','二组','008');
commit;

Oracle 行列转换函数pivot使用_第2张图片

SELECT * FROM pivottest pivot(max(学生姓名) AS 姓名,max(学号) AS 学号 for 日期 in ('01' AS 一班,'02' AS 二班)) order by 学生分组

按日期值穿透,姓名、学号聚合之后,不能存在影响聚合的【主键】字段存在,否则会存在无法合并行的情况
Oracle 行列转换函数pivot使用_第3张图片
通过处理原表,去掉主键的查询,即可实现。(详细参见参考里第一篇文章,这里主要还是自己去理解,哪些列能要,哪些不能要)

SELECT * FROM (SELECT  日期, 
                       学生姓名, 
                       学生分组, 
                       学号 FROM pivottest) pivot(max(学生姓名) AS 姓名,max(学号) AS 学号 for 日期 in ('01' AS 一班,'02' AS 二班)) order by 学生分组

在这里插入图片描述


参考文章:

Oracle 行列转换函数pivot、unpivot的使用(二)(含decode或case用法,该作者其他文章也有点儿意思)
oracle官方
Oracle:Pivot 和 Unpivot 转多列并包含多个名称
简书上的文章,用pivot实现行转列,含case 用法
Oracle 行转列 动态出转换的列(含动态行转列)


你可能感兴趣的:(数据库,oracle,数据库)