【Oracle】pivot 與 unpivot 語法

pivot – 行轉列函數

語法:
pivot(聚合函數 FOR 需要轉爲列的值所在的列名 IN (需要轉爲列名的值)

示例:
測試數據

SELECT 'zhangsan' STUDENT, '20190709' BIRTHDAY, 'CHINESE' SUBJECT, '90' MARK
  FROM DUAL
UNION ALL
SELECT 'zhangsan' STUDENT, '20190709' BIRTHDAY, 'MATH' SUBJECT, '98' MARK
  FROM DUAL
UNION ALL
SELECT 'zhangsan' STUDENT, '20190709' BIRTHDAY, 'ENGLISH' SUBJECT, '85' MARK
  FROM DUAL
UNION ALL
SELECT 'zhangsan' STUDENT, '20190709' BIRTHDAY, 'HISTORY' SUBJECT, '89' MARK
  FROM DUAL


1
2
3
4
5
6
7
8
9
10
11

轉換後

WITH temp AS (
SELECT 'zhangsan' STUDENT, '20190709' BIRTHDAY, 'CHINESE' SUBJECT, '90' MARK
  FROM DUAL
UNION ALL
SELECT 'zhangsan' STUDENT, '20190709' BIRTHDAY, 'MATH' SUBJECT, '98' MARK
  FROM DUAL
UNION ALL
SELECT 'zhangsan' STUDENT, '20190709' BIRTHDAY, 'ENGLISH' SUBJECT, '85' MARK
  FROM DUAL
UNION ALL
SELECT 'zhangsan' STUDENT, '20190709' BIRTHDAY, 'HISTORY' SUBJECT, '89' MARK
  FROM DUAL)


  

SELECT * FROM temp pivot( MAX(MARK) FOR subject IN ('CHINESE', 'MATH', 'ENGLISH', 'HISTORY'))


1
2
3
4
5
6
7
8
9
10
11
12
13
14


unpivot – 列轉行函數

語法:
unpivot(轉換後增加的列名 FOR 原列名轉爲行之後對應的列名 IN (需要轉爲行的列名)

示例:
測試數據

SELECT 'zhangsan' STUDENT,
   '20190709' BIRTHDAY,
   '90' CHINESE,
   '98' MATH,
   '95' ENGLISH,
   '89' HISTORY
FROM DUAL;


1
2
3
4
5
6
7

轉換後

SELECT STUDENT, BIRTHDAY, SUBJECT, MARK
FROM (SELECT 'zhangsan' STUDENT,
           '20190709' BIRTHDAY,
           '90' CHINESE,
           '98' MATH,
           '95' ENGLISH,
           '89' HISTORY
      FROM DUAL) UNPIVOT(MARK FOR SUBJECT IN(CHINESE,
                                          MATH,
                                          ENGLISH,
                                          HISTORY));


1
2
3
4
5
6
7
8
9
10
11


unpivot – 列轉行函數(高級用法 – 多列轉行)
示例
測試數據

WITH tmp AS(
SELECT 'LH' fac,'D5' Dong, '1F' flo, 1 D1,1 D2,0 D3, 1 F1, 1 F2, 1 F3, 1 S1, 1 S2, 1 S3 FROM Dual 
UNION ALL
SELECT 'LH' fac,'D5' Dong, '2F' flo, 1 D1,1 D2,0 D3, 1 F1, 1 F2, 1 F3, 1 S1, 1 S2, 1 S3 FROM Dual 
UNION ALL
SELECT 'GL' fac,'C4' Dong, '1F' flo, 1 D1,1 D2,0 D3, 1 F1, 1 F2, 1 F3, 1 S1, 1 S2, 1 S3 FROM Dual 
UNION ALL
SELECT 'GL' fac,'C4' Dong, '2F' flo, 1 D1,1 D2,0 D3, 1 F1, 1 F2, 1 F3, 1 S1, 1 S2, 1 S3 FROM Dual )
SELECT * FROM  tmp;


1
2
3
4
5
6
7
8
9


轉換後

WITH tmp AS(
SELECT 'LH' fac,'D5' Dong, '1F' flo, 1 D1,1 D2,0 D3, 1 F1, 1 F2, 1 F3, 1 S1, 1 S2, 1 S3 FROM Dual 
UNION ALL
SELECT 'LH' fac,'D5' Dong, '2F' flo, 1 D1,1 D2,0 D3, 1 F1, 1 F2, 1 F3, 1 S1, 1 S2, 1 S3 FROM Dual 
UNION ALL
SELECT 'GL' fac,'C4' Dong, '1F' flo, 1 D1,1 D2,0 D3, 1 F1, 1 F2, 1 F3, 1 S1, 1 S2, 1 S3 FROM Dual 
UNION ALL
SELECT 'GL' fac,'C4' Dong, '2F' flo, 1 D1,1 D2,0 D3, 1 F1, 1 F2, 1 F3, 1 S1, 1 S2, 1 S3 FROM Dual )
SELECT * FROM  tmp UNPIVOT((STATUS1, STATUS2, STATUS3) FOR TYP IN ((D1, D2, D3), (F1, F2, F3), (S1, S2, S3)));


1
2
3
4
5
6
7
8
9


該語法爲 Oracle 11g 新語法,低版本 Oracle 使用會報錯: ORA-00933:SQL command not properly ended

oracle 版本查詢:

SELECT * FROM PRODUCT_COMPONENT_VERSION;


————————————————
版權聲明:本文爲CSDN博主「◣NSD◥」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/shaotaiban1097/article/details/95189755

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章