oracle行列轉換-列轉行
在itpub論壇看到一則貼子,行列轉換總結,寫的很全面。現將我的測試結果覆上來,留著日後參考。
附上測試指令碼,有表及表中資料如下
附上測試指令碼,有表及表中資料如下
點選(此處)摺疊或開啟
-
SQL> create table t_col_row(
-
2 id int,
-
3 c1 varchar2(10),
-
4 c2 varchar2(10),
-
5 c3 varchar2(10));
-
-
表已建立。
-
-
SQL> insert into t_col_row values(1,'v11','v21','v31');
-
-
已建立 1 行。
-
-
SQL> insert into t_col_row values(2,'v12','v22',null);
-
-
已建立 1 行。
-
-
SQL> insert into t_col_row values(3,'v13',null,'v33');
-
-
已建立 1 行。
-
-
SQL> insert into t_col_row values(4,null,'v24','v34');
-
-
已建立 1 行。
-
-
SQL> insert into t_col_row values(5,'v15',null,null);
-
-
已建立 1 行。
-
-
SQL> insert into t_col_row values(6,null,null,'v35');
-
-
已建立 1 行。
-
-
SQL> insert into t_col_row values(7,null,null,null);
-
-
已建立 1 行。
-
-
SQL> commit;
-
-
提交完成。
查詢t_col_row表中資料如下:
現要將此表資料做列轉行,共有三種方法,如下:
1)UNION ALL
適用範圍:8i,9i,10g及以後版本
2)MODEL
適用範圍:10g及以後
3)collection
適用範圍:8i,9i,10g及以後版本
要建立一個物件和一個集合:
注:11g之後,又出了個listagg分析函式,更容易實現列轉行,由於本機裝的是10g,無法測試,先附一段網上的程式碼吧。
SQL> select * from t_col_row;
ID C1 C2 C3
---------- ---------- ---------- ----------
1 v11 v21 v31
2 v12 v22
3 v13 v33
4 v24 v34
5 v15
6 v35
7
已選擇7行。
現要將此表資料做列轉行,共有三種方法,如下:
1)UNION ALL
適用範圍:8i,9i,10g及以後版本
點選(此處)摺疊或開啟
-
SQL> select id,'c1' cn,c1 cv from t_col_row
-
2 union all
-
3 select id,'c2' cn,c2 cv from t_col_row
-
4 union all
-
5 select id,'c3' cn,c3 cv from t_col_row;
-
-
ID CN CV
-
---------- -- ----------
-
-
1 c1 v11
-
2 c1 v12
-
3 c1 v13
-
4 c1
-
5 c1 v15
-
6 c1
-
7 c1
-
1 c2 v21
-
2 c2 v22
-
3 c2
-
4 c2 v24
-
-
ID CN CV
-
---------- -- ----------
-
-
5 c2
-
6 c2
-
7 c2
-
1 c3 v31
-
2 c3
-
3 c3 v33
-
4 c3 v34
-
5 c3
-
6 c3 v35
-
7 c3
-
- 已選擇21行。
適用範圍:10g及以後
點選(此處)摺疊或開啟
-
SQL> SELECT id, cn, cv FROM t_col_row
-
2 MODEL
-
3 RETURN UPDATED ROWS
-
4 PARTITION BY (ID)
-
5 DIMENSION BY (0 AS n)
-
6 MEASURES ('xx' AS cn,'yyy' AS cv,c1,c2,c3)
-
7 RULES UPSERT ALL
-
8 (
-
9 cn[1] = 'c1',
-
10 cn[2] = 'c2',
-
11 cn[3] = 'c3',
-
12 cv[1] = c1[0],
-
13 cv[2] = c2[0],
-
14 cv[3] = c3[0]
-
15 )
-
16 ORDER BY ID,cn;
-
-
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行。
3)collection
適用範圍:8i,9i,10g及以後版本
要建立一個物件和一個集合:
點選(此處)摺疊或開啟
-
SQL> create type cv_pair as object(cn varchar2(10),cv varchar2(10));
-
2 /
-
-
型別已建立。
-
-
SQL> create type cv_varr as varray(8) of cv_pair;
-
2 /
-
-
型別已建立。
-
-
SQL> select id,t.cn as cn,t.cv as cv
-
2 from t_col_row,
-
3 table(cv_varr(cv_pair('c1',t_col_row.c1),
-
4 cv_pair('c2',t_col_row.c2),
-
5 cv_pair('c3',t_col_row.c3)))t
-
6 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行。
點選(此處)摺疊或開啟
-
with temp as(
-
select 'China' nation ,'Guangzhou' city from dual union all
-
select 'China' nation ,'Shanghai' city from dual union all
-
select 'China' nation ,'Beijing' city from dual union all
-
select 'USA' nation ,'New York' city from dual union all
-
select 'USA' nation ,'Bostom' city from dual union all
-
select 'Japan' nation ,'Tokyo' city from dual
-
)
-
select nation,listagg(city,',') within GROUP (order by city)
-
from temp
- group by nation
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21251711/viewspace-1066741/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle行列轉換-行轉列Oracle
- 行列轉換,列行轉換統計
- oracle行列轉換-字串轉換成多列Oracle字串
- oracle行列轉換-多列轉換成字串Oracle字串
- Oracle-行列轉換Oracle
- oracle行列轉換-多行轉換成字串Oracle字串
- Oracle 行列轉換 經典Oracle
- Oracle 行列轉換總結Oracle
- Oracle 行列轉換小結Oracle
- Oracle行列轉換總結Oracle
- 行列轉換
- oracle和mysql的行列轉換OracleMySql
- DB2行列轉置之行轉列DB2
- pivot、unpivot實現oracle行列轉換Oracle
- Oracle--SQL行列轉換實戰OracleSQL
- 行列轉換 交叉表 (轉)
- Kettle行列轉換
- 偽行列轉換!
- 行列轉換sqlSQL
- Oracle行列轉換及pivot子句的用法Oracle
- 試驗Oracle中實現行列轉換的方法(轉)Oracle
- MySQL行列轉換拼接MySql
- 行列轉換之大全~~~
- sql server 行列轉換SQLServer
- excel列轉行怎麼做 excel如何轉置行列Excel
- oracle 11g 使用 pivot/unpivot 行列轉換Oracle
- 用ORACLE分析函式實現行列轉換Oracle函式
- mysql行列轉換詳解MySql
- sql server行列轉換案例SQLServer
- 【SQL 學習】行列轉換SQL
- 【SQL】行列轉換方法示例SQL
- Shell練習 行列轉換
- 複雜的行列轉換
- SQL 列行轉換SQL
- DB2 行列轉置之行轉列DB2
- Oracle11新特性——行列轉換語句(二)Oracle
- Oracle11新特性——行列轉換語句(一)Oracle
- oracle 列轉行Oracle