ITPub博客

首页 > 数据库 > Oracle > oracle行列转换-行转列

oracle行列转换-行转列

原创 Oracle 作者:pwz1688 时间:2014-01-03 14:29:07 0 删除 编辑

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

点击(此处)折叠或打开

  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博客 ” ,链接:https://blog.itpub.net/21251711/viewspace-1066819/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-30

  • 博文量
    106
  • 访问量
    736046