欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Oracle 行列转换问题总结

程序员文章站 2022-05-04 22:42:55
...

如果要整理出Oracle版中的FAQs,我想其中一定少不了行转列问题。今天利用一些闲暇时候整理一下我的理解与心得。在展开我的总结之前,我反复思考这样的问题:什么是行转列?在何种情况下需要行转列? 一,什么是行转列? 观察了行转列前后的变化,可以诠释为

如果要整理出Oracle版中的FAQs,我想其中一定少不了行转列问题。今天利用一些闲暇时候整理一下我的理解与心得。在展开我的总结之前,我反复思考这样的问题:什么是行转列?在何种情况下需要行转列?

一,什么是行转列?

观察了行转列前后的变化,可以诠释为,由多行数据转换为单行(多)列的展现,注意这里对单行的理解,是每组单行。 (如有理解上的偏颇或者误区,多请指正!)

二,行转列的类型

Oracle版中有很多行列转换的问题,汇总起来,大致有两种。

Type1:

Oracle 行列转换问题总结 转换为Oracle 行列转换问题总结

这种需求多为展示简单的统计汇总结果,实现也相对简单。

Type2:

Oracle 行列转换问题总结转换为 Oracle 行列转换问题总结

相较之下,这种转换就相对复杂一些,在完成行转列的同时,还需要对某个列进行聚合。

实验

现在有一张Score表,存储学生成绩详情。

Oracle 行列转换问题总结

Code-1 : SELECT SDTID, SNAME,WMSYS.WM_CONCAT(SCORE) AS "SCORE1,SCORE2,SCORE3"
FROM SCORE
GROUP BY SDTID, SNAME;

Oracle 行列转换问题总结

这里仅仅使用了一个Oralce 内置函数WMSYS.WM_CONCAT()就完成了Tyoe-1的转换。

Code- 2:SELECT SDTID,
SNAME,
MAX(DECODE(COURSE, '语文',SCORE)) 语文,
MAX(DECODE(COURSE, '数学' ,SCORE)) 数学,
MAX(DECODE(COURSE, '英语' ,SCORE)) 英语
FROM SCORE
GROUP BY SDTID, SNAME;

Oracle 行列转换问题总结

这是基于原表COURSE列的转换,COURSE有几种值(语文,数学,英语)直接决定了我们的代码量。

这让我们不禁展开延伸,如果COURSE中有100门科目,我们也需要傻乎乎地堆砌代码么?答案是否定的。在我们无法,或者懒于确定这些组别(如这里的语文,数学)时,我们可以采用创建自定义函数的方法来动态生成代码,现给出一个经典示例《行转列通用过程http://topic.csdn.net/u/20100109/13/6a10c168-f190-4766-b838-adbf03c4ac7b.html?93286

三,为什么行转列?

通过以上的阐述和示例,我们发现行转列实则对原表的一种转换,以达到从另外的角度来展示和分析数据。个人觉得在实际开发需求中其用途还是比较有限的,因为开发人员很多时候接触的都是些范式表,表定义都相当规范,数据结构也很合理。 而在数据仓库领域,在纷繁复杂的海量数据中的数据挖掘和报表开发,这种行列转换就大有可为了。

申明:欢迎大家一起学习交流,切勿盲从,博文中如有错误偏颇的观点或理解,还望指正!谢谢!