Oracle行转列(PIVOT)

        在实际业务开发环境中,我们经常会遇到要对查询的数据集进行行转列的需求。那么Oracle是如何一一实现的呢?本文也将通过几个实例来详细讲解一下。

Oracle行转列

       Oracle行转列就是把某一个字段的值作为唯一值,然后另外一个字段的行值转换成它的列值。这里依然利用我们系统的学生成绩表作为例子,成绩表记录(行)当中对应着每一个科目的每一个学生的成绩,那我们要做出一个报表是每个学生的所有科目作为一列展示出学生的成绩信息。案例数据如下:

那我们要如何实现呢?下面就一一介绍几种方法:

1、首先我们肯定想到的是利用Oracle分组(group by)应该可以实现,实现代码如下:

select c.stuname,
       --利用分组聚合函数
       sum(decode(b.coursename, '英语(2018上学期)', t.score, 0)) as "英语(2018上学期)",
       sum(decode(b.coursename, '数学(2018上学期)', t.score, 0)) as "英语(2018上学期)",
       sum(decode(b.coursename, '语文(2018上学期)', t.score, 0)) as "英语(2018上学期)"
  from STUDENT.SCORE t, student.course b, student.stuinfo c
 where t.courseid = b.courseid
   and t.stuid = c.stuid
 group by c.stuname

我们利用group by对学生进行分组,然后利用decode对对应的课程的成绩值进行转换,然后再求和即可得到该门成绩的结果值,结果如下:

2、Oracle11g之后提供了自带函数PIVOT可以完美解决这个行转列的需求,具体语法结构如下:

SELECT * FROM (数据查询集)
PIVOT 
(
 SUM(Score/*行转列后 列的值*/) FOR 
 coursename/*需要行转列的列*/ IN (转换后列的值)
)

   具体代码如下:

select * from  (select c.stuname,
       b.coursename,
       t.score
  from STUDENT.SCORE t, student.course b, student.stuinfo c
 where t.courseid = b.courseid
   and t.stuid = c.stuid )  /*数据源*/
PIVOT 
(
 SUM(score/*行转列后 列的值*/) 
 FOR coursename/*需要行转列的列*/ IN ('英语(2018上学期)' as 英语,'数学(2018上学期)' as 数学,'语文(2018上学期)' as 语文 )
) ;

    结果如下:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值