您的当前位置:首页正文

Oracle行列转换问题总结

2020-11-09 来源:筏尚旅游网

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

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

一,什么是行转列?

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

二,行转列的类型

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

Type1:

转换为

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

Type2:

转换为

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

实验

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

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

这里仅仅使用了一个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;

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

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

三,为什么行转列?

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

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

显示全文