使用listagg函式完成行列轉換一例
在程式開發中,經常遇到需把多行的資料在一行中顯示出來,也就是常見的行列轉換,例如:源資料為:
BSC_ID |
ATTR_NAME |
VALUE |
8f33773a-d93b-4433-891b-672dd94441b4 |
regular |
1.5,1.6 |
type |
無 |
|
weight |
25 |
|
time |
2015-04-30 |
|
madeof |
中國 |
|
length |
2.5 |
計劃按如下格式顯示出來:
BSC_ID |
regular |
type |
weight |
time |
madeof |
length |
8f33773a-d93b-4433-891b-672dd94441b4 |
1.5,1.6 |
無 |
25 |
2015-04-30 |
中國 |
2.5 |
在PB 開發中,可以使用CrossTab 型別的資料視窗來實現。本文將介紹如何在單條SQL實現。
整個方法的思路還是透過Group By 和Decode 語句來實現,例如為提取regular 的值,可以對每列decode(attr_name, 'regular', value, '')按BSC_ID分組求聚合,也就是字串相加。 對於數字求和,可以使用Sum函式,對於字串求和,9i 開始可以使用 自定義聚合函式()來實現。10G 中在新版電子病歷系統中,使用的是一個未公開的函式wmsys.wm_concat,這種方法在日常資料維護時可以使用,但不適合在程式中使用。 到了11G, 終於提供了listagg函式完成字串的相加功能。 具體可參考如下實現:
SQL> select bsc_id , attr_name , value from KVPAIR_DATA;
BSC_ID ATTR_NAME VALUE
---------------------------------------- ---------- ----------
8f33773a-d93b-4433-891b-672dd94441b4 regular 1.5
8f33773a-d93b-4433-891b-672dd94441b4 type 無
8f33773a-d93b-4433-891b-672dd94441b4 weight 25
8f33773a-d93b-4433-891b-672dd94441b4 time 2015-04-30
8f33773a-d93b-4433-891b-672dd94441b4 madeof 中國
8f33773a-d93b-4433-891b-672dd94441b4 length 2.5
8f33773a-d93b-4433-891b-672dd94441b4 regular 1.6
7 rows selected.
SQL> select bsc_id,
2 listagg(decode(attr_name, 'regular', value, ''), ',')
3 within group(order by bsc_id) "regular",
4 listagg(decode(attr_name, 'type', value, ''), '')
5 within group(order by bsc_id) "type",
6 listagg(decode(attr_name, 'weight', value, ''), '')
7 within group(order by bsc_id) "weight",
8 listagg(decode(attr_name, 'time', value, ''), ',')
9 within group(order by bsc_id) "time",
10 listagg(decode(attr_name, 'madeof', value, ''), ',')
11 within group(order by bsc_id) "madeof",
12 listagg(decode(attr_name, 'length', value, ''), ',')
13 within group(order by bsc_id) "length"
14 from KVPAIR_DATA
15 group by bsc_id;
BSC_ID regular type weight
---------------------------------------- ---------- ---------- ----------
time madeof length
---------- ---------- ----------
8f33773a-d93b-4433-891b-672dd94441b4 1.5,1.6 無 25
2015-04-30 中國 2.5
1 row selected.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9036/viewspace-1625061/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [轉]decode函式和行列互換函式
- 用ORACLE分析函式實現行列轉換Oracle函式
- 【函式】Oracle12c 列轉行函式使用listagg函式Oracle
- 【SQL 分析函式】wm_concat 行列轉換SQL函式
- LISTAGG 函式函式
- 行列轉換
- Kettle行列轉換
- 偽行列轉換!
- 行列轉換sqlSQL
- 使用sed做特殊的行列轉換
- 用listagg函式分組實現列轉行函式
- 行列轉換 交叉表 (轉)
- 轉換函式函式
- 用oracle分析函式進行行列轉向Oracle函式
- Oracle-行列轉換Oracle
- MySQL行列轉換拼接MySql
- 行列轉換之大全~~~
- sql server 行列轉換SQLServer
- 事件處理函式OnEnter OnExit 使用一例 (轉)事件函式
- oracle行列轉換-多行轉換成字串Oracle字串
- 行列轉換,列行轉換統計
- oracle行列轉換-行轉列Oracle
- oracle行列轉換-列轉行Oracle
- oracle 11g 使用 pivot/unpivot 行列轉換Oracle
- mysql行列轉換詳解MySql
- sql server行列轉換案例SQLServer
- Oracle 行列轉換 經典Oracle
- Oracle 行列轉換總結Oracle
- Oracle 行列轉換小結Oracle
- 【SQL 學習】行列轉換SQL
- 【SQL】行列轉換方法示例SQL
- Oracle行列轉換總結Oracle
- Shell練習 行列轉換
- 複雜的行列轉換
- numtoyminterval函式——數字轉換函式函式
- oracle行列轉換-字串轉換成多列Oracle字串
- oracle行列轉換-多列轉換成字串Oracle字串
- 【轉】Oracle: wmsys.wm_concat、sys_connect_by_path、自定義函式實現行列轉換Oracle函式