视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Oracle行列转换问题总结
2020-11-09 07:36:00 责编:小采
文档


如果要整理出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。

三,为什么行转列?

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

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

下载本文
显示全文
专题