Oracle 行列转换函数pivot使用

问题描述:

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

解决方案:

注意:多聚合必须重命名。
在这里插入图片描述

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;

原表图

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

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

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 行转列 动态出转换的列(含动态行转列)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值