【SQL】行列轉換方法示例
一、行變列
1.建立測試表test,並初始化實驗資料
sec@ora10g> create table test (name_id varchar2(10), name varchar2(10));
sec@ora10g> insert into test values ('01','Andy1');
sec@ora10g> insert into test values ('01','Andy2');
sec@ora10g> insert into test values ('01','Andy3');
sec@ora10g> insert into test values ('01','Andy4');
sec@ora10g> insert into test values ('02','Steven1');
sec@ora10g> insert into test values ('02','Steven2');
sec@ora10g> insert into test values ('02','Steven3');
sec@ora10g> insert into test values ('02','Steven4');
sec@ora10g> commit;
2.檢視測試表資料
sec@ora10g> select * from test order by name_id;
NAME_ID NAME
---------- ----------------------------------------
01 Andy1
01 Andy4
01 Andy3
01 Andy2
02 Steven1
02 Steven4
02 Steven3
02 Steven2
8 rows selected.
3.我們按照name_id不同值將該表橫向轉換如下
SELECT t1.name_id,
SUBSTR (MAX (SYS_CONNECT_BY_PATH (t1.NAME, ';')), 2) NAME
FROM (SELECT a.name_id, a.NAME,
ROW_NUMBER () OVER (PARTITION BY a.name_id ORDER BY a.NAME) rn
FROM TEST a) t1
START WITH t1.rn = 1
CONNECT BY t1.name_id = PRIOR t1.name_id AND t1.rn - 1 = PRIOR t1.rn
GROUP BY t1.name_id;
NAME_ID NAME
---------- ----------------------------------------
01 Andy1;Andy2;Andy3;Andy4
02 Steven1;Steven2;Steven3;Steven4
該條SQL語句的編寫思想是:
1)根據分組後的行號,構造一棵樹(或者多棵)。
2)把從根到葉子的值串接起來。
二、列變行
1.重新構造測試表test,並初始化實驗資料
sec@ora10g> drop table test purge;
sec@ora10g> create table test (name_id varchar2(10), name varchar2(40));
sec@ora10g> insert into test values ('01','Andy1;Andy2;Andy3;Andy4');
sec@ora10g> insert into test values ('02','Steven1;Steven2;Steven3;Steven4');
sec@ora10g> commit;
2.檢視測試表資料
sec@ora10g> select * from test;
NAME_ID NAME
---------- ----------------------------------------
01 Andy1;Andy2;Andy3;Andy4
02 Steven1;Steven2;Steven3;Steven4
3.行變列轉換的SQL語句如下
SELECT t.name_id,
SUBSTR (t.name,
INSTR (';' || t.name, ';', 1, rn),
INSTR (t.name || ';', ';', 1, rn)
- INSTR (';' || t.name, ';', 1, rn)
) name
FROM (SELECT a.name_id, a.name, b.rn
FROM test a,
(SELECT ROWNUM rn
FROM DUAL
CONNECT BY ROWNUM <= 100) b
WHERE INSTR (';' || a.name, ';', 1, rn) > 0) t
ORDER BY 1, 2;
NAME_ID NAME
---------- ----------------------------------------
01 Andy1
01 Andy2
01 Andy3
01 Andy4
02 Steven1
02 Steven2
02 Steven3
02 Steven4
8 rows selected.
該條SQL語句的編寫思想
1)構造虛擬表把源資料的行數增加
2)根據行號選擇顯示欄位的不同部分
secooler
10.09.27
-- The End --
1.建立測試表test,並初始化實驗資料
sec@ora10g> create table test (name_id varchar2(10), name varchar2(10));
sec@ora10g> insert into test values ('01','Andy1');
sec@ora10g> insert into test values ('01','Andy2');
sec@ora10g> insert into test values ('01','Andy3');
sec@ora10g> insert into test values ('01','Andy4');
sec@ora10g> insert into test values ('02','Steven1');
sec@ora10g> insert into test values ('02','Steven2');
sec@ora10g> insert into test values ('02','Steven3');
sec@ora10g> insert into test values ('02','Steven4');
sec@ora10g> commit;
2.檢視測試表資料
sec@ora10g> select * from test order by name_id;
NAME_ID NAME
---------- ----------------------------------------
01 Andy1
01 Andy4
01 Andy3
01 Andy2
02 Steven1
02 Steven4
02 Steven3
02 Steven2
8 rows selected.
3.我們按照name_id不同值將該表橫向轉換如下
SELECT t1.name_id,
SUBSTR (MAX (SYS_CONNECT_BY_PATH (t1.NAME, ';')), 2) NAME
FROM (SELECT a.name_id, a.NAME,
ROW_NUMBER () OVER (PARTITION BY a.name_id ORDER BY a.NAME) rn
FROM TEST a) t1
START WITH t1.rn = 1
CONNECT BY t1.name_id = PRIOR t1.name_id AND t1.rn - 1 = PRIOR t1.rn
GROUP BY t1.name_id;
NAME_ID NAME
---------- ----------------------------------------
01 Andy1;Andy2;Andy3;Andy4
02 Steven1;Steven2;Steven3;Steven4
該條SQL語句的編寫思想是:
1)根據分組後的行號,構造一棵樹(或者多棵)。
2)把從根到葉子的值串接起來。
二、列變行
1.重新構造測試表test,並初始化實驗資料
sec@ora10g> drop table test purge;
sec@ora10g> create table test (name_id varchar2(10), name varchar2(40));
sec@ora10g> insert into test values ('01','Andy1;Andy2;Andy3;Andy4');
sec@ora10g> insert into test values ('02','Steven1;Steven2;Steven3;Steven4');
sec@ora10g> commit;
2.檢視測試表資料
sec@ora10g> select * from test;
NAME_ID NAME
---------- ----------------------------------------
01 Andy1;Andy2;Andy3;Andy4
02 Steven1;Steven2;Steven3;Steven4
3.行變列轉換的SQL語句如下
SELECT t.name_id,
SUBSTR (t.name,
INSTR (';' || t.name, ';', 1, rn),
INSTR (t.name || ';', ';', 1, rn)
- INSTR (';' || t.name, ';', 1, rn)
) name
FROM (SELECT a.name_id, a.name, b.rn
FROM test a,
(SELECT ROWNUM rn
FROM DUAL
CONNECT BY ROWNUM <= 100) b
WHERE INSTR (';' || a.name, ';', 1, rn) > 0) t
ORDER BY 1, 2;
NAME_ID NAME
---------- ----------------------------------------
01 Andy1
01 Andy2
01 Andy3
01 Andy4
02 Steven1
02 Steven2
02 Steven3
02 Steven4
8 rows selected.
該條SQL語句的編寫思想
1)構造虛擬表把源資料的行數增加
2)根據行號選擇顯示欄位的不同部分
secooler
10.09.27
-- The End --
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-609167/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用vue實現行列轉換的一種方法。Vue
- mysql行列轉換詳解MySql
- 記錄一個行列轉換
- Spark實現行列轉換pivot和unpivotSpark
- Oracle行列轉換及pivot子句的用法Oracle
- SQL 如何實現動態的行列轉置SQL
- Restcloud ETl實踐之資料行列轉換RESTCloud
- LVS - 地址轉換(NAT)模式示例模式
- sql隱式轉換SQL
- SQL 行轉列 PIVOT 學習示例SQL
- 例項詳解構建數倉中的行列轉換
- 在報表中錄入資料時如何實現行列轉換
- Lambda 轉換 SQL ORM 工具 SqlRepoExSQLORM
- Oracle SQL_ID轉換成SQL_HASH_VALUEOracleSQL
- 【SQL】Oracle查詢轉換之 OR用法SQLOracle
- 報表如何實現行列互換效果?
- 工具方法:時間轉換
- transqlate:將任何SQL轉換為PostgreSQL方言SQL
- Spark SQL中的RDD與DataFrame轉換SparkSQL
- flink將bathch dataset 轉換為sql操作BATSQL
- 實現二維陣列的行列互換陣列
- excel列轉行怎麼做 excel如何轉置行列Excel
- T-SQL——將字串轉換為多列SQL字串
- 將 SQL轉換成 Laravel Query Builder 程式碼SQLLaravelUI
- 【SQL】Oracle查詢轉換之謂詞推送SQLOracle
- Oracle_SQL部分_時間轉換(案例一)OracleSQL
- sql server 資料型別轉換函式SQLServer資料型別函式
- 日期與字串的互相轉換SQL語句字串SQL
- 抽樣之逆轉換方法
- Blob實現與File DataURL canvas相互轉換示例詳解Canvas
- 【SQL】Oracle查詢轉換之檢視合併SQLOracle
- SQL SERVER 日期格式化、日期和字串轉換SQLServer字串
- PDF轉換器手機版,PPT轉PDF方法
- QString與QByteArray互相轉換的方法
- CAD怎麼轉換成PDF格式?CAD轉換PDF的正確方法
- web 展現資料時如何實現行列互換Web
- [轉載] Python日曆模組| 使用示例的weekday()方法Python
- PDF轉PPT怎麼轉?好用的PDF轉換方法有哪些?
- 20201214]查詢隱式轉換的sql語句.txtSQL