日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

--該測(cè)試腳本可以直接運(yùn)行

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

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

--創(chuàng)建測(cè)試表、添加測(cè)試數(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開(kāi)始,開(kāi)發(fā)者可以創(chuàng)建用戶自定義的合計(jì)函數(shù),除了PL/SQL外,還可以使用任何Oralce所支持的語(yǔ)言(如C++或者Java)來(lái)創(chuàng)建合計(jì)函數(shù)。TYPE頭定義必須包含ODCIAggregateInitializeODCIAggregateIterate、ODCIAggregateMergeODCIAggregateTerminate這四個(gè)接口函數(shù)。*/

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

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

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

/*Merge函數(shù),用來(lái)返回成功標(biāo)記的。*/

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

  
 
 
  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ù)器沒(méi)有配置成支持并行處理的方式,可以去掉參數(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;

方法四的另一種寫(xiě)法

估計(jì)類似的寫(xiě)法還有很多,這個(gè)和上一個(gè)不同在于用的沒(méi)有帶有start with(filter功能)的connect,并借助level和first_value來(lái)實(shí)現(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ù)庫(kù)中分組字符串相加
文章轉(zhuǎn)載:http://www.5511xx.com/article/cociphh.html