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