日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
數(shù)據(jù)庫中分組字符串相加

--該測試腳本可以直接運行

創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、都勻網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、商城網(wǎng)站建設(shè)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為都勻等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

--現(xiàn)在想把數(shù)據(jù)庫中數(shù)據(jù)按照固定字段分組相加,這里總結(jié)了5種方法。

--創(chuàng)建測試表、添加測試數(shù)據(jù)

  
 
 
  1. create table test(id varchar2(10),mc varchar2(50)); 
  2. insert into test values('1','11111'); 
  3. insert into test values('1','22222'); 
  4. insert into test values('2','11111'); 
  5. insert into test values('2','22222'); 
  6. insert into test values('3','11111'); 
  7. insert into test values('3','22222'); 
  8. insert into test values('3','33333'); 
  9. commit;

--方法一:

  
 
 
  1. set serveroutput on size 1000000 
  2. declare 
  3. union_mc varchar2(200); 
  4. begin 
  5. for cur_a in(select distinct id from test) loop 
  6. for cur_b in(select mc from test where id=cur_a.id) loop 
  7. union_mc:=union_mc||cur_b.mc; 
  8. end loop; 
  9. dbms_output.put_line(cur_a.id||chr(9)||union_mc); 
  10. union_mc := ''; 
  11. end loop; 
  12. end; 

--方法二:

  
 
 
  1. CREATE OR REPLACE function link(v_id varchar2) 
  2. return varchar2 
  3. is 
  4. union_mc varchar2(200); 
  5. begin 
  6. for cur in (select mc from test where id=v_id) loop 
  7. union_mc := union_mc||cur.mc; 
  8. end loop; 
  9. union_mc := rtrim(union_mc,1); 
  10. return union_mc; 
  11. end; 
  12. select id,link(id) from test group by id;

--方法三:

/*從Oracle 9i開始,開發(fā)者可以創(chuàng)建用戶自定義的合計函數(shù),除了PL/SQL外,還可以使用任何Oralce所支持的語言(如C++或者Java)來創(chuàng)建合計函數(shù)。TYPE頭定義必須包含ODCIAggregateInitializeODCIAggregateIterate、ODCIAggregateMergeODCIAggregateTerminate這四個接口函數(shù)。*/

/*Initialize函數(shù)對數(shù)據(jù)組各個需要處理的字段各運行一次。自然的,我需要為每一個值準備一個新的清單,所以需要初始化持久變量list,這里初始化值為null。*/

/*Iterate函數(shù)處理返回的行,所以實際上是由它來創(chuàng)建返回的值的清單。先測試list是否為空,如果為空,就把list直接設(shè)置為所引入的value值;如果list變量非空,則給list添加一個逗號后再插入value值,list的最大允許字符數(shù)32767。*/

/*Terminate函數(shù)在數(shù)據(jù)組的每個行的感興趣字段數(shù)據(jù)被處理后執(zhí)行。在這個函數(shù)中我只需簡單的返回清單變量即可。*/

/*Merge函數(shù),用來返回成功標記的。*/

/*創(chuàng)建自己的合計函數(shù)擴展了Oracle統(tǒng)計和文本處理能力。*/

  
 
 
  1. create or replace type t_cat as object 
  2. union_mc VARCHAR2(200), 
  3. static function ODCIAggregateInitialize(sctx IN OUT t_cat) return number, 
  4. member function ODCIAggregateIterate(self IN OUT t_cat,value IN varchar2) return number, 
  5. member function ODCIAggregateTerminate(self IN t_cat,returnValue OUT varchar2, flags IN number) return number, 
  6. member function ODCIAggregateMerge(self IN OUT t_cat,ctx2 IN t_cat) return number 
  7. ); 
  8. create or replace type body t_cat is 
  9. static function ODCIAggregateInitialize(sctx IN OUT t_cat ) 
  10. return number is 
  11. begin 
  12. sctx := t_cat(''); 
  13. return ODCIConst.Success; 
  14. end; 
  15. member function ODCIAggregateIterate(self IN OUT t_cat, value IN varchar2) 
  16. return number is 
  17. begin 
  18. self.union_mc := self.union_mc || value; 
  19. return ODCIConst.Success; 
  20. end; 
  21. member function ODCIAggregateTerminate(self IN t_cat, returnValue OUT varchar2, flags IN number) return number is 
  22. begin 
  23. returnValue := self.union_mc; 
  24. return ODCIConst.Success; 
  25. end; 
  26. member function ODCIAggregateMerge(self IN OUT t_cat , ctx2 IN t_cat ) return number is 
  27. begin 
  28. return ODCIConst.Success; 
  29. end; 
  30. end; 
  31. /

/*如果你的Oracle服務(wù)器沒有配置成支持并行處理的方式,可以去掉參數(shù)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;

--方法四:

--oracle9i以上版本

  
 
 
  1. select id,ltrim(max(sys_connect_by_path(mc,';')),';') from( 
  2. select id,mc,row_number() over(partition by id order by id) id1, 
  3. row_number() over(order by id) + dense_rank() over(order by id) id2 
  4. from test 
  5. start with id1=1 connect by prior id2 = id2 -1 
  6. group by id order by id;

方法四的另一種寫法

估計類似的寫法還有很多,這個和上一個不同在于用的沒有帶有start with(filter功能)的connect,并借助level和first_value來實現(xiàn)。

  
 
 
  1. SELECT distinct id,ltrim(first_value(mc_add) over (partition by id order BY l DESC),';') 
  2. from ( 
  3. SELECT id,LEVEL l,sys_connect_by_path(mc,';') mc_add from 
  4. select id||rownum rn,id||rownum-1 rn_small,id,mc from test 
  5. CONNECT BY PRIOR rn = rn_small 
  6. ;

方法五:

  
 
 
  1. select id,wm_concat(mc) from test group by id

標題名稱:數(shù)據(jù)庫中分組字符串相加
本文地址:http://www.dlmjj.cn/article/cociphh.html