oracle 列轉行、行轉列


 

地址: https://blog.csdn.net/leq3915/article/details/80460316

 

行轉列: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的字段值,表示分數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM