当前位置:Gxlcms > 数据库问题 > Oracle使用SQL实现矩阵转置

Oracle使用SQL实现矩阵转置

时间:2021-07-01 10:21:17 帮助过:22人阅读

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 B FROM 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, B
                  FROM   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实现矩阵转置

标签:for   技术   tmp   nbsp   11g   pivot   date   nio   测试   

人气教程排行