Oracle使用SQL實現矩陣轉置
阿新 • • 發佈:2017-09-22
row 多人 遇到 數據 number decode 分享 展示 mode
在使用數據庫使用報表時,往往會遇到矩陣轉置。這個需求在Excel是很容易實現的,但很多人都不知道怎麽用Oracle數據庫實現,下面給大家展示幾種使用SQL實現的方法。
需求:表1轉置成表2
測試數據:
CREATE TABLE TMP AS SELECT ‘A1‘ AS A, ‘B1‘ AS B FROM DUAL UNION ALL SELECT ‘A2‘ AS A, ‘B2‘ AS B FROM DUAL UNION ALL SELECT ‘A3‘ AS A, ‘B3‘ AS B FROM DUAL UNION ALL SELECT ‘A4‘ AS A, ‘B4‘ AS BFROM DUAL UNION ALL SELECT ‘A5‘ AS A, ‘B5‘ AS B FROM DUAL
方法一:UNPIVOT+PIVOT 數據庫11g以上
SELECT * FROM (SELECT R, COL, V FROM (SELECT ROW_NUMBER() OVER(ORDER BY A, B) AS R, A, B FROM TMP) UNPIVOT(V FOR COL IN(A, B))) PIVOT (MAX(V) FOR R IN(1, 2, 3, 4, 5));
方法二: MAX+DECODE
SELECT COL, MAX(DECODE(R, 1, V)), MAX(DECODE(R, 2, V)), MAX(DECODE(R, 3, V)), MAX(DECODE(R, 4, V)), MAX(DECODE(R, 5, V)) FROM (SELECT T.R, DECODE(T1.L, 1, ‘A‘, 2, ‘B‘) AS COL, DECODE(T1.L, 1, A, 2, B) V FROM (SELECT ROW_NUMBER() OVER(ORDER BY A, B) AS R, A, BFROM TMP) T, (SELECT LEVEL L FROM DUAL CONNECT BY LEVEL <= 2) T1) GROUP BY COL
方法三:MODEL子句 數據庫10g以上
SELECT DECODE(R, 1, ‘A‘, ‘B‘) AS COL, V1, V2, V3, V4, V5 FROM TMP MODEL RETURN UPDATED ROWS DIMENSION BY(ROW_NUMBER()OVER(ORDER BY A,B) AS R) MEASURES (A,B,A AS V1,A AS V2,A AS V3,A AS V4,A AS V5) RULES ( V1[R<=2]=DECODE(CV(R),1,A[1],2,B[1]), V2[R<=2]=DECODE(CV(R),1,A[2],2,B[2]), V3[R<=2]=DECODE(CV(R),1,A[3],2,B[3]), V4[R<=2]=DECODE(CV(R),1,A[4],2,B[4]), V5[R<=2]=DECODE(CV(R),1,A[5],2,B[5]) )
Oracle使用SQL實現矩陣轉置