Oracle 行列转换问题总结

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

三,为什么行转列?

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

 

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

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值