如果要整理出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。
三,为什么行转列?通过以上的阐述和示例,我们发现行转列实则对原表的一种转换,以达到从另外的角度来展示和分析数据。个人觉得在实际开发需求中其用途还是比较有限的,因为开发人员很多时候接触的都是些范式表,表定义都相当规范,数据结构也很合理。 而在数据仓库领域,在纷繁复杂的海量数据中的数据挖掘和报表开发,这种行列转换就大有可为了。
申明:欢迎大家一起学习交流,切勿盲从,博文中如有错误偏颇的观点或理解,还望指正!谢谢!