• 技术文章 >数据库 >Oracle

    oracle横表怎么转纵表

    长期闲置长期闲置2022-05-24 15:23:06原创106

    在oracle中,可以利用pivot()函数将横表转为纵表,该函数用于将行转为列,语法为“SELECT * FROM (数据查询集)PIVOT(SUM(行转列后 列的值)FOR 需要行转列的列 IN (转换后列的值))”。

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

    oracle横表怎么转纵表

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

    13.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对对应的课程的成绩值进行转换,然后再求和即可得到该门成绩的结果值,结果如下:

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

    结果如下:

    15.png

    推荐教程:《Oracle视频教程

    以上就是oracle横表怎么转纵表的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:oracle
    上一篇:归纳总结Oracle视图知识点 下一篇:oracle怎么去掉换行符
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• oracle中表的类型有哪些• oracle怎么修改sga和pga• Oracle怎么修改session• oracle怎么查询clob字段数据• oracle怎么查询表所在的表空间
    1/1

    PHP中文网