oracle行列轉換-行轉列

pwz1688發表於2014-01-03

接上篇文章。
建表語句如下:

點選(此處)摺疊或開啟

  1. SQL> create table t_row_col as
  2.   2 select id,'c1' cn,c1 cv from t_col_row
  3.   3 union all
  4.   4 select id,'c2' cn,c2 cv from t_col_row
  5.   5 union all
  6.   6 select id,'c3' cn,c3 cv from t_col_row;

  7. 表已建立。

  8. SQL> select * from t_row_col order by 1,2;

  9.         ID CN CV
  10. ---------- -- ----------

  11.          1 c1 v11
  12.          1 c2 v21
  13.          1 c3 v31
  14.          2 c1 v12
  15.          2 c2 v22
  16.          2 c3
  17.          3 c1 v13
  18.          3 c2
  19.          3 c3 v33
  20.          4 c1
  21.          4 c2 v24

  22.         ID CN CV
  23. ---------- -- ----------

  24.          4 c3 v34
  25.          5 c1 v15
  26.          5 c2
  27.          5 c3
  28.          6 c1
  29.          6 c2
  30.          6 c3 v35
  31.          7 c1
  32.          7 c2
  33.          7 c3

  34. 已選擇21行。

下面進行行列轉換
1)AGGREGATE FUNCTION
適用範圍:8i,9i,10g及以後版本

點選(此處)摺疊或開啟

  1. SQL> select id,max(decode(cn,'c1',cv,null)) as c1,
  2.   2 max(decode(cn,'c2',cv,null)) as c2,
  3.   3 max(decode(cn,'c3',cv,null)) as c3
  4.   4 from t_row_col
  5.   5 group by id;

  6.         ID C1 C2 C3
  7. ---------- ---------- ---------- ----------

  8.          1 v11 v21 v31
  9.          6         v35
  10.          2 v12 v22
  11.          4     v24 v34
  12.          5 v15
  13.          3 v13     v33
  14.          7

  15. 已選擇7行。

MAX聚集函式也可以用sum、min、avg等其他聚集函式替代。
還有一種行轉列的方式,就是相同組中的行值變為單個列值,但轉置的行值不變為列名。
如下程式碼所示:

點選(此處)摺疊或開啟

  1. SQL> SELECT id,
  2.   2 MAX(decode(rn, 1, cn, NULL)) cn_1,
  3.   3 MAX(decode(rn, 1, cv, NULL)) cv_1,
  4.   4 MAX(decode(rn, 2, cn, NULL)) cn_2,
  5.   5 MAX(decode(rn, 2, cv, NULL)) cv_2,
  6.   6 MAX(decode(rn, 3, cn, NULL)) cn_3,
  7.   7 MAX(decode(rn, 3, cv, NULL)) cv_3
  8.   8 FROM (SELECT id,
  9.   9 cn,
  10.  10 cv,
  11.  11 row_number() over(PARTITION BY id ORDER BY cn, cv) rn
  12.  12 FROM t_row_col)
  13.  13 GROUP BY ID;

  14.         ID CN CV_1 CN CV_2 CN CV_3
  15. ---------- -- ---------- -- ---------- -- ----------

  16.          1 c1 v11 c2 v21 c3 v31
  17.          2 c1 v12 c2 v22 c3
  18.          3 c1 v13 c2     c3 v33
  19.          4 c1     c2 v24 c3 v34
  20.          5 c1 v15 c2     c3
  21.          6 c1     c2     c3 v35
  22.          7 c1     c2     c3

  23. 已選擇7行。


 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21251711/viewspace-1066819/,如需轉載,請註明出處,否則將追究法律責任。

相關文章