接上篇文章。
建表语句如下:
-
SQL> create table t_row_col as
-
2 select id,'c1' cn,c1 cv from t_col_row
-
3 union all
-
4 select id,'c2' cn,c2 cv from t_col_row
-
5 union all
-
6 select id,'c3' cn,c3 cv from t_col_row;
-
-
表已创建。
-
-
SQL> select * from t_row_col order by 1,2;
-
-
ID CN CV
-
---------- -- ----------
-
-
1 c1 v11
-
1 c2 v21
-
1 c3 v31
-
2 c1 v12
-
2 c2 v22
-
2 c3
-
3 c1 v13
-
3 c2
-
3 c3 v33
-
4 c1
-
4 c2 v24
-
-
ID CN CV
-
---------- -- ----------
-
-
4 c3 v34
-
5 c1 v15
-
5 c2
-
5 c3
-
6 c1
-
6 c2
-
6 c3 v35
-
7 c1
-
7 c2
-
7 c3
-
-
已选择21行。
下面进行行列转换
1)AGGREGATE FUNCTION
适用范围:8i,9i,10g及以后版本
-
SQL> select id,max(decode(cn,'c1',cv,null)) as c1,
-
2 max(decode(cn,'c2',cv,null)) as c2,
-
3 max(decode(cn,'c3',cv,null)) as c3
-
4 from t_row_col
-
5 group by id;
-
-
ID C1 C2 C3
-
---------- ---------- ---------- ----------
-
-
1 v11 v21 v31
-
6 v35
-
2 v12 v22
-
4 v24 v34
-
5 v15
-
3 v13 v33
-
7
-
-
已选择7行。
MAX聚集函数也可以用sum、min、avg等其他聚集函数替代。
还有一种行转列的方式,就是相同组中的行值变为单个列值,但转置的行值不变为列名。
如下代码所示:
-
SQL> SELECT id,
-
2 MAX(decode(rn, 1, cn, NULL)) cn_1,
-
3 MAX(decode(rn, 1, cv, NULL)) cv_1,
-
4 MAX(decode(rn, 2, cn, NULL)) cn_2,
-
5 MAX(decode(rn, 2, cv, NULL)) cv_2,
-
6 MAX(decode(rn, 3, cn, NULL)) cn_3,
-
7 MAX(decode(rn, 3, cv, NULL)) cv_3
-
8 FROM (SELECT id,
-
9 cn,
-
10 cv,
-
11 row_number() over(PARTITION BY id ORDER BY cn, cv) rn
-
12 FROM t_row_col)
-
13 GROUP BY ID;
-
-
ID CN CV_1 CN CV_2 CN CV_3
-
---------- -- ---------- -- ---------- -- ----------
-
-
1 c1 v11 c2 v21 c3 v31
-
2 c1 v12 c2 v22 c3
-
3 c1 v13 c2 c3 v33
-
4 c1 c2 v24 c3 v34
-
5 c1 v15 c2 c3
-
6 c1 c2 c3 v35
-
7 c1 c2 c3
-
-
已选择7行。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21251711/viewspace-1066819/
,如需转载,请注明出处,否则将追究法律责任。