1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > oracle列转行 多个字段_oracle 列转行 行转列

oracle列转行 多个字段_oracle 列转行 行转列

时间:2022-07-23 05:30:53

相关推荐

oracle列转行 多个字段_oracle 列转行 行转列

行转列:PIVOT

列转行:UNPIVOT

这两个是在oracle11g上面新增的函数。下面举例说明用法。

PIVOT:

学生成绩表,原数据:

select class_name, student_name, course_type, result, created_date

from class_tmp_2;

每个同学的两门成绩,是两条数据,因为业务需要,展示给用户看的时候,用户想要每个同学只要一条数据,并且把所有成绩都展示出来,比如

这个时候就需要用到行专列函数PIVOT.

SELECT class_name, student_name, 语文, 数学, created_date

FROM (SELECT CLASS_NAME, STUDENT_NAME, COURSE_TYPE, RESULT, CREATED_DATE

FROM CLASS_TMP_2) T

PIVOT(SUM(RESULT)

FOR COURSE_TYPE IN('语文' AS 语文, '数学' AS 数学));

浅灰色的sql和上面的原数据sql一样,主要看一下后面的PIVOT部分。

sum(result):成绩之和(PIVOT内需有聚集函数)

for course_type in ('语文' as语文, '数学' as数学):将course_type列的字段值转换成列名,其中,字段值是'语文',转换成语文列,字段值是'数学',转换成数学列,这两列的字段值,即前面的sum(result)。

不用函数也可以得到,如下sql:

select t1.class_name,

t1.student_name,

t1.result 语文,

t2.result 数学,

t1.created_date

from (select a.class_name,

a.student_name,

a.course_type,

a.result,

a.created_date

from class_tmp_2 a

where a.course_type = '语文') t1,

(select a.class_name,

a.student_name,

a.course_type,

a.result,

a.created_date

from class_tmp_2 a

where a.course_type = '数学') t2

where t1.class_name = t2.class_name

and t1.student_name = t2.student_name;

UNPIVOT:列转行

反过来,原数据如下:

而我想要得到的结果如下:

SQL:

select class_name, student_name, course_type, result, created_date

from class_tmp

unpivot(result for course_type in(chinese_result,math_result));

原数据的chinese_result列和math_result列的列名(浅灰色),将转换为新建列course_type的字段值,表示课种。

原数据的chinese_result列和math_result列的字段值,将转换为新建列result的字段值,表示分数。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。