資料庫中分組字串相加
SQL> select * from test;
ID MC
---------- -------------
1 11111
1 22222
2 11111
2 22222
3 11111
3 22222
3 33333
已選擇7行。
SQL> select id,ltrim(max(sys_connect_by_path(mc,',')),',') row2col
from (select id,mc,
id+(row_number() over(order by id)) node_id,
row_number() over(partition by id order by id) rn
from test)
start with rn = 1
connect by node_id-1 = prior node_id
group by id
order by id;
ID ROW2COL
---------- -------------------------------------------------------------
1 11111,22222
2 11111,22222
3 11111,22222,33333
SQL> select id,replace(max(sys_connect_by_path(mc,',')),',') row2col
from (select id,mc,
id+(row_number() over(order by id)) node_id,
row_number() over(partition by id order by id) rn
from test)
start with rn = 1
connect by node_id-1 = prior node_id
group by id
order by id;
ID ROW2COL
---------- ------------------------------------------------------------
1 1111122222
2 1111122222
3 111112222233333
--該測試指令碼可以直接執行
--現在想把資料庫中資料按照固定欄位分組相加,這裡總結了三種方法。
--建立測試表、新增測試資料
create table test(id varchar2(10),mc varchar2(50));
insert into test values('1','11111');
insert into test values('1','22222');
insert into test values('2','11111');
insert into test values('2','22222');
insert into test values('3','11111');
insert into test values('3','22222');
insert into test values('3','33333');
commit;
--方法一:
set serveroutput on size 1000000
declare
union_mc varchar2(200);
begin
for cur_a in(select distinct id from test) loop
for cur_b in(select mc from test where id=cur_a.id) loop
union_mc:=union_mc||cur_b.mc;
end loop;
dbms_output.put_line(cur_a.id||chr(9)||union_mc);
union_mc := '';
end loop;
end;
/
--方法二:
CREATE OR REPLACE function link(v_id varchar2)
return varchar2
is
union_mc varchar2(200);
begin
for cur in (select mc from test where id=v_id) loop
union_mc := union_mc||cur.mc;
end loop;
union_mc := rtrim(union_mc,1);
return union_mc;
end;
/
select id,link(id) from test group by id;
--方法三:
/*從Oracle 9i開始,開發者可以建立使用者自定義的合計函式,除了PL/SQL外,還可以使用任何Oralce所支援的語言(如C++或者Java)來建立合計函式。TYPE頭定義必須包含ODCIAggregateInitialize、ODCIAggregateIterate、ODCIAggregateMerge和ODCIAggregateTerminate這四個介面函式。*/
/*Initialize函式對資料組各個需要處理的欄位各執行一次。自然的,我需要為每一個值準備一個新的清單,所以需要初始化持久變數list,這裡初始化值為null。*/
/*Iterate函式處理返回的行,所以實際上是由它來建立返回的值的清單。先測試list是否為空,如果為空,就把list直接設定為所引入的value值;如果list變數非空,則給list新增一個逗號後再插入value值,list的最大允許字元數32767。*/
/*Terminate函式在資料組的每個行的感興趣欄位資料被處理後執行。在這個函式中我只需簡單的返回清單變數即可。*/
/*Merge函式,用來返回成功標記的。*/
/*建立自己的合計函式擴充套件了Oracle統計和文字處理能力。*/
create or replace type t_cat as object
(
union_mc VARCHAR2(200),
static function ODCIAggregateInitialize(sctx IN OUT t_cat) return number,
member function ODCIAggregateIterate(self IN OUT t_cat,value IN varchar2) return number,
member function ODCIAggregateTerminate(self IN t_cat,returnValue OUT varchar2, flags IN number) return number,
member function ODCIAggregateMerge(self IN OUT t_cat,ctx2 IN t_cat) return number
);
create or replace type body t_cat is
static function ODCIAggregateInitialize(sctx IN OUT t_cat )
return number is
begin
sctx := t_cat('');
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT t_cat, value IN varchar2)
return number is
begin
self.union_mc := self.union_mc || value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN t_cat, returnValue OUT varchar2, flags IN number) return number is
begin
returnValue := self.union_mc;
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT t_cat , ctx2 IN t_cat ) return number is
begin
return ODCIConst.Success;
end;
end;
/
/*如果你的Oracle伺服器沒有配置成支援並行處理的方式,可以去掉引數PARALLEL_ENABLE*/
create or replace function catstr(v_mc varchar2) return varchar2 PARALLEL_ENABLE AGGREGATE USING t_cat;
/
select id,catstr(mc) from test group by id;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/219138/viewspace-913429/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Add Strings 字串相加字串
- PHP字串數字相加PHP字串
- LeetCode-415-字串相加LeetCode字串
- Facebook 面試題 | 字串相加面試題字串
- SQL Server資料庫中分頁編號的另一種方式SQLServer資料庫
- DB資料庫中分散式一致性演算法資料庫分散式演算法
- 真菌基因組資料庫資料庫
- SQL-去除資料庫字串左右空格SQL資料庫字串
- 資料庫中字串連線符的使用資料庫字串
- 組態王與Access資料庫通訊--④資料庫測試資料庫
- 【資料庫資料恢復】Oracle資料庫ASM磁碟組掉線如何恢復資料?資料庫資料恢復OracleASM
- 【資料庫資料恢復】ASM磁碟組掉線的Oracle資料庫資料恢復案例資料庫資料恢復ASMOracle
- linq如何設定連線資料庫的字串資料庫字串
- mysql資料庫concat拼接字串亂碼問題MySql資料庫字串
- 如何在 Linux 中分割和重組檔案!Linux
- Oracle - 資料庫的組成簡介Oracle資料庫
- django哪個模組配置資料庫Django資料庫
- python資料庫模組-Cx_OraclePython資料庫Oracle
- hduoj1002 A + B Problem II (大數相加 字串模擬)字串
- mysql資料庫如何使用concat函式連線字串MySql資料庫函式字串
- 如何從資料庫提取海波龍的組織主資料資料庫
- springboot建立與資料庫關聯模組Spring Boot資料庫
- 營銷模組資料庫表解析(二)資料庫
- 資料庫之DQL排序&分組&函式資料庫排序函式
- sqlserver資料庫日期如何格式化-日期轉換字串SQLServer資料庫字串
- 資料結構 - 字串資料結構字串
- MySQL資料庫中的分組函式ROLLUPMySql資料庫函式
- 達夢資料庫DM Exception字串截斷錯誤,略坑~資料庫Exception字串
- JavaScript組合字串JavaScript字串
- 我倒在了美團面試演算法題:字串大數相加面試演算法字串
- 城中分支
- Python資料庫模組(sqlite3,SQLite3)Python資料庫SQLite
- QT繪圖模組與資料庫的結合QT繪圖資料庫
- ADFS 部署資料庫AlwaysOn後應用端的連線字串更改資料庫字串
- Sql Server 資料庫獲取字串中小寫字母的SQL語句SQLServer資料庫字串
- (python)資料結構—字串Python資料結構字串
- Python資料型別(數字,字串,[列表],(元組),{字典:字典值},{列表,列表2})Python資料型別字串
- 資料庫也可以像電腦一樣組裝:使用Kafka建立關聯式資料庫 – Robert Yokota資料庫Kafka
- 查詢當前資料庫存在某個字串的儲存過程資料庫字串儲存過程