Oracle使用pivot和unpivot函数实现行列转换
一、需求说明
项目开发过程中涉及到oracle数据库的数据操作;但是需要将数据进行列的互转,通过查阅资料可知在oracle中有三种方式可以实现行列互转:
①使用decode 函数;
②使用case when 函数;
③使用pivot函数;
二、实现方法
我这里有一个数据表内容如下:
2.1、实现将上图内容转为行——decode函数
select "name", max(decode("course", '语文', "score")) 语文, max(decode("course", '数学', "score")) 数学, max(decode("course", '英语', "score")) 英语, sum("score") 总分 from "grade" group by "name";
2.2、实现将上图内容转为行——case when函数
select "name", max(case when "course" = '语文' then "score" end) 语文, max(case when "course" = '数学' then "score" end) 数学, max(case when "course" = '英语' then "score" end) 英语, sum("score") 总分 from "grade" group by "name";
2.3、实现将上图内容转为行——pivot函数
pivot函数的语法:
pivot(聚合函数 for 列名 in(类型))
select t.* from(
(select * from 原表名称)
pivot(
max(需转的列名称)
for 需转的列名称 in(需转列对应的值1,需转列对应的值2,需转列对应的值3
)
)t
SELECT t.*,(t.语文+t.数学+t.英语)总分 from ((SELECT "name","course","score" from "grade")pivot ( max("score") for "course" in('语文' 语文,'数学' 数学,'英语' 英语) ))t ORDER BY "name";
2.4、实现将上图内容转为列——unpivot函数
需要转的内容如下图:
unpivot函数的语法:
SELECT 列名称,需定义的列1名称,需定义的列2名称 from 表名称 unpivot (需定义的列2名称 for 需定义的列1名称 in(列2值1,列2值2,列2值3));
SELECT "name" 名字,course 课程,score 分数 from "grade2" unpivot (score for course in("chinese","math","english"));
SELECT 名字,course 课程,score 分数 from ( SELECT "name" 名字,"chinese" 语文,"math" 数学,"english" 英语 from "grade2") unpivot (score for course in(语文,数学,英语))
到此这篇关于Oracle使用pivot和unpivot函数实现行列转换的文章就介绍到这了,更多相关Oracle行列转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
PL/SQL Developer15和Oracle Instant Client安装配置详细图文教程
PL/SQL Developer是一种集成的开发环境,专门用于开发、测试、调试和优化Oracle PL/SQL存储程序单元,比如触发器等,这篇文章主要给大家介绍了关于PL/SQL Developer15和Oracle Instant Client安装配置的详细图文教程,需要的朋友可以参考下2024-04-04SQL优化之针对count、表的连接顺序、条件顺序、in及exist的优化
这篇文章主要介绍了SQL优化之针对count、表的连接顺序、条件顺序、in及exist的优化,有助于读者深入理解Oracle的运行效率及优化策略,需要的朋友可以参考下2014-07-07ORACLE出现错误1033和错误ORA-00600的解决方法
这篇文章主要介绍了ORACLE出现错误1033和错误ORA-00600的解决方法,需要的朋友可以参考下2014-07-07Linux下安装Oracle 11g出现prvf-0002错误解决办法
这篇文章主要介绍了Linux下安装Oracle 11g出现prvf-0002错误解决办法的相关资料,需要的朋友可以参考下2016-12-12
最新评论