• 技术文章 >数据库 >Oracle

    oracle怎么实现行列转换

    青灯夜游青灯夜游2022-01-25 17:23:11原创71

    实现行列转换的方法:1、利用PIVOT()函数实现行转列,语法“SELECT * FROM (数据集) PIVOT (SUM(Score) FOR coursename IN (转换后列的值))”;2、利用unpivot()函数实现列转行。

    本教程操作环境:Windows7系统、Oracle 11g版、Dell G3电脑。

    Oracle行转列

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

    1.png

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

    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.png

    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 语文 )
    ) ;

    结果如下:

    3.png

    Oracle列转行

    Oracle列转行就是把一行当中的列的字段按照行的唯一值转换成多行数据。 比如上文Oracle行转列 中的学生成绩表的基础数据是一个学生的一个科目成绩对应着是一条记录。然后我们进行了行转列后变成一个学生对应着每列(数学、英语、语文)科目的成绩是一条记录。那么本文就是要把之前转换后的学生成绩表(备份表score_copy)再次进行列转行,转换为原始数据。案例数据如下:

    4.png

    5.png

    那我们要如何实现列转行呢?下面介绍两种常用的方法:

    1、利用union all 进行拼接,可以完美的把对应的列转为行记录,具体代码如下:

    select t.stuname, '英语' as coursename ,t.英语 as score  from SCORE_COPY t
    union all
    select t.stuname, '数学' as coursename ,t.数学 as score  from SCORE_COPY t
    union all
    select t.stuname, '语文' as coursename ,t.语文 as score  from SCORE_COPY t

    结果如下:

    6.png

    2、利用Oracle自带的列转行函数unpivot也可以完美解决该问题,具体语法结构如下:

    select 字段 from 数据集
    unpivot(自定义列名/*列的值*/ for 自定义列名 in(列名))

    实现代码如下:

    select stuname, coursename ,score from
    score_copy  t
    unpivot
    (score for coursename in (英语,数学,语文))

    结果如下:

    7.png

    推荐教程:《Oracle教程

    以上就是oracle怎么实现行列转换的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:oracle 行列转换
    上一篇:oracle怎样修改用户 下一篇:oracle怎样转换日期格式

    相关文章推荐

    • oracle怎样修改字符集• oracle怎样递归查询子节点• oracle是应用软件吗• oracle存储过程的参数类型有哪些• 怎样删除oracle用户• oracle中触发器和存储过程是什么

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网