在oracle中,可以利用pivot()函数将横表转为纵表,该函数用于将行转为列,语法为“SELECT * FROM (数据查询集)PIVOT(SUM(行转列后 列的值)FOR 需要行转列的列 IN (转换后列的值))”。
本教程操作环境:Windows10系统、Oracle 11g版、Dell G3电脑。
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 语文 )
) ;
结果如下:
推荐教程:《Oracle视频教程》
以上就是oracle横表怎么转纵表的详细内容,转载自php中文网
发表评论 取消回复