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