数据库中分组字符串相加

  发布时间:2025-11-04 04:14:46   作者:玩站小弟   我要评论
--该测试脚本可以直接运行--现在想把数据库中数据按照固定字段分组相加,这里总结了5种方法。--创建测试表、添加测试数据复制createtabletest(idvarchar2(10),mcvarch 。

--该测试脚本可以直接运行

--现在想把数据库中数据按照固定字段分组相加,数据这里总结了5种方法。库中

数据库中分组字符串相加

--创建测试表、分组添加测试数据

复制createtable test(id varchar2(10),字符mc varchar2(50));    insertinto test values(1,11111);    insertinto test values(1,22222);    insertinto test values(2,11111);    insertinto test values(2,22222);    insertinto test values(3,11111);    insertinto test values(3,22222);    insertinto test values(3,33333);    commit;  1.2.3.4.5.6.7.8.9.

--方法一:

复制set serveroutput onsize 1000000    declare union_mc varchar2(200);    begin for cur_a in(selectdistinct 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;    /   1.2.3.4.5.6.7.8.9.10.11.12.13.

--方法二:

复制CREATEORREPLACEfunction 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 groupby id;  1.2.3.4.5.6.7.8.9.10.11.12.13.14.

--方法三:

/*从Oracle 9i开始,开发者可以创建用户自定义的串相合计函数,除了PL/SQL外,数据还可以使用任何Oralce所支持的库中语言(如C++或者Java)来创建合计函数。TYPE头定义必须包含ODCIAggregateInitialize、分组ODCIAggregateIterate、字符ODCIAggregateMerge和ODCIAggregateTerminate这四个接口函数。串相*/

/*Initialize函数对数据组各个需要处理的数据字段各运行一次。自然的库中,我需要为每一个值准备一个新的分组清单,所以需要初始化持久变量list,IT技术网字符这里初始化值为null。串相*/

/*Iterate函数处理返回的行,所以实际上是由它来创建返回的值的清单。先测试list是否为空,如果为空,就把list直接设置为所引入的value值;如果list变量非空,则给list添加一个逗号后再插入value值,list的最大允许字符数32767。*/

/*Terminate函数在数据组的每个行的感兴趣字段数据被处理后执行。企商汇在这个函数中我只需简单的返回清单变量即可。*/

/*Merge函数,用来返回成功标记的。*/

/*创建自己的合计函数扩展了Oracle统计和文本处理能力。*/

复制createorreplace type t_cat as object    (    union_mc VARCHAR2(200),    staticfunction ODCIAggregateInitialize(sctx INOUT t_cat) return number,    member function ODCIAggregateIterate(self INOUT 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 INOUT t_cat,ctx2 IN t_cat) return number    );    createorreplace type body t_cat is staticfunction ODCIAggregateInitialize(sctx INOUT t_cat )    return number is begin sctx := t_cat();    return ODCIConst.Success;    end;    member function ODCIAggregateIterate(self INOUT 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 INOUT t_cat , ctx2 IN t_cat ) return number is begin return ODCIConst.Success;    end;    end;    /  1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.

/*如果你的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;

--方法四:

--oracle9i以上版本

复制select id,ltrim(max(sys_connect_by_path(mc,;)),;) from(    select id,mc,row_number() over(partition by id orderby id) id1,    row_number() over(orderby id) + dense_rank() over(orderby id) id2    from test    )    start with id1=1 connectbyprior id2 = id2 -1    groupby id orderby id;   1.2.3.4.5.6.7.

方法四的另一种写法

估计类似的写法还有很多,这个和上一个不同在于用的没有带有start with(filter功能)的connect,并借助level和first_value来实现。

复制SELECTdistinct id,ltrim(first_value(mc_add) over (partition by id orderBY l DESC),;)    from (    SELECT id,LEVEL l,sys_connect_by_path(mc,;) mc_add from (    select id||rownum rn,id||rownum-1 rn_small,id,mc from test    )    CONNECTBYPRIOR rn = rn_small    )    ;  1.2.3.4.5.6.7.8.9.

方法五:

复制select id,wm_concat(mc) from test groupby id  1.

云南idc服务商
  • Tag:

相关文章

最新评论