oralce 处理列转行的三种方式 最后生成表格样式数据

【背景】

项目需要把数据库里面查询结果提取到表格里面来,区别日常的数据提取,本次数据表格样式复杂一些,因为涉及到收视人数、次数的问题,处理起来多费了一些时间,大概需求就是下面这样子

数据表的查询结果是下面这个样子:

看上去感觉很简单,但是之前没接触过,拿到这个需求是一头雾水的。

看看解决后的效果吧

 

【解决】

网上了解到了有三种解决方法,借用别人的例子,简单记录一下。

namesubjectsocre
小米语文90
小米数学100

 需要转换成:

name语文数学
小米90100

方法一 使用DECODE 函数,

这个方法plsql可以直接实现,但是我用jdbc无法实现,一直提示decode方法的计数方法有问题,不得不换一种,在解决过程中发现如果查询结果没有数据的时候,就会返回空,plsql这边没问题,但是在jdbc接收值的时候可能会报错,所以在查询的时候 每一列外面套用一个nvl()函数,可以解决这个返回值为空的问题。

SELECT
	NAME,
	SUM( DECODE(SUBJCT, "语文", SCORE) ) AS “语文”,
	SUM( DECODE(SUBJCT, "数学", SCORE) ) AS “数学”
FROM
	T_STUDENT_SOCRE
GROUP BY 
NAME

方法二、使用CASE WHEN

最终我是采用这个方式实现需求的,虽然列字段确实很多,但是一劳永逸还是可以试试

 
SELECT
	NAME,
	SUM( CASE SUBJECT WHEN "语文" THEN E_VALUE ELSE 0 END ) AS “语文”,
	SUM( CASE SUBJECT WHEN "数学" THEN E_VALUE ELSE 0 END ) AS “数学”
FROM
	T_STUDENT_SOCRE
GROUP BY 
NAME

方法三、使用的是PRVOT函数

这个方法我没使用成功,而且没有吃透他的处理方式,所以暂时就不多做叙述了

SELECT
 NAME
"语文",
“数学”
FROM
T_STUDENT_SOCRE
PRVOT(MAX(SOCRE) for SUBJECT in ("语文" as “语文“,”数学“ as "数学") )

最后我是通过WEB页面来实现这个需求的,因为手动导出还是比较麻烦,这里又回顾了一下,写table标签行合并 列合并的知识,差不多就是这个样子