精华内容
下载资源
问答
  • oracle多行合并一行

    2014-11-14 14:51:23
    oracle中有时需要把多行数据合并一行然后输出,

    oracle中有时需要把多行数据合并成一行然后输出


    oracle提供了一个函数replace(WMSYS.WM_CONCAT(XINGZHENGZZID),',','、') 


    WMSYS.WM_CONCAT这个函数可以把多行合并成一行

    展开全文
  • create or replace type string_sum_obj as object(sum_string varchar2(4000),–聚合函数的实质就是个对象 static function ODCIAggregateInitialize(v_self in out string_sum_obj) return number, --对象初始化...

    –方法A:
    –创建type头
    create or replace type string_sum_obj as object(sum_string varchar2(4000),–聚合函数的实质就是一个对象
    static function ODCIAggregateInitialize(v_self in out string_sum_obj) return number, --对象初始化
    member function ODCIAggregateIterate(self in out string_sum_obj, value in varchar2) return number, --聚合函数的迭代方法(这是最重要的方法)
    member function ODCIAggregateMerge(self in out string_sum_obj, v_next in string_sum_obj) return number, --当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合
    member function ODCIAggregateTerminate(self in string_sum_obj, return_value out varchar2 ,v_flags in number) return number); --终止聚集函数的处理,返回聚集函数处理的结果

    –创建type具体
    create or replace type body string_sum_obj is static function ODCIAggregateInitialize(v_self in out string_sum_obj) return number is
    begin
    v_self := string_sum_obj(null);
    return ODCICONST.Success;
    end;

    member function ODCIAggregateIterate(self in out string_sum_obj, value in varchar2) return number is
    begin
    /* 连接,解决逗号分隔第一个字母是逗号的问题 /
    if not self.sum_string is null then
    self.sum_string := self.sum_string ||’,’|| value;
    else
    self.sum_string := self.sum_string || value;
    end if;
    return ODCICONST.Success;
    /
    最大值 /
    if self.sum_string<value then
    self.sum_string:=value;
    end if;
    /
    最小值 */
    if self.sum_string>value then
    self.sum_string:=value;
    end if;
    return ODCICONST.Success;
    end;

    member function ODCIAggregateMerge(self in out string_sum_obj, v_next in string_sum_obj) return number is
    begin
    /* 连接 /
    self.sum_string := self.sum_string || v_next.sum_string;
    return ODCICONST.Success;
    /
    最大值 /
    if self.sum_string<v_next.sum_string then
    self.sum_string:=v_next.sum_string;
    end if;
    /
    最小值 */
    if self.sum_string>v_next.sum_string then
    self.sum_string:=v_next.sum_string;
    end if;
    return ODCICONST.Success;
    end;

    member function ODCIAggregateTerminate(self in string_sum_obj, return_value out varchar2 ,v_flags in number) return number is
    begin
    return_value:= self.sum_string;
    return ODCICONST.Success;
    end;
    end;

    –创建函数
    create or replace function wm_concat(value Varchar2) return Varchar2
    parallel_enable aggregate using string_sum_obj;

    –方法B:
    –先创建这个类型
    create or replace type strcat_type as object(cat_string varchar2(4000),
    static function ODCIAggregateInitialize(cs_ctx In Out strcat_type) return number,
    member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2) return number,
    member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type) return number,
    member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out varchar2,flags in number) return number);

    –类型体内容
    create or replace type body strcat_type is static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number is
    begin
    cs_ctx := strcat_type( null );
    return ODCIConst.Success;
    end;

    member function ODCIAggregateIterate(self IN OUT strcat_type, value IN varchar2) return number is
    begin
    self.cat_string := self.cat_string || ‘;’|| value;
    return ODCIConst.Success;
    end;

    member function ODCIAggregateTerminate(self IN Out strcat_type, returnValue OUT varchar2, flags IN number) return number is
    begin
    returnValue := ltrim(rtrim(self.cat_string,’;’),’;’);
    return ODCIConst.Success;
    end;

    member function ODCIAggregateMerge(self IN OUT strcat_type, ctx2 IN Out strcat_type) return number is
    begin
    self.cat_string := self.cat_string || ‘;’ || ctx2.cat_string;
    return ODCIConst.Success;
    end;
    end;

    –创建函数
    CREATE OR REPLACE FUNCTION strcat(input varchar2) RETURN varchar2
    PARALLEL_ENABLE AGGREGATE USING strcat_type;

    –取数示例:
    select strcat(user_name) from fnd_user where user_id < 100;
    select wm_concat(user_name) from fnd_user where user_id < 100;

    –函数listagg也可以直接实现功能(可配合Group By使用)
    select listagg(fu.user_name, ‘,’) within group(order by fu.user_id) names
    from fnd_user fu
    where fu.user_id < 100;

    展开全文
  • 虽然这种方式可以实现需求,但是如果表t的数据量很大,i的值又很多的情况下,因为针对每个i值都要执行句select,扫描和排序的次数和i的值成正比,性能会非常差。  2.使用sys_connect_by_path   Sql代码  ...

    假如有如下表,其中各个i值对应的行数是不定的 

    Sql代码  
    1. SQL> select * from t;  
    2.   
    3.          I A          D  
    4. ---------- ---------- -------------------  
    5.          1 b          2008-03-27 10:55:42  
    6.          1 a          2008-03-27 10:55:46  
    7.          1 d          2008-03-27 10:55:30  
    8.          2 z          2008-03-27 10:55:55  
    9.          2 t          2008-03-27 10:55:59  
    10.   
    11. --- 要获得如下结果,注意字符串需要按照D列的时间排序:  
    12.   
    13. 1  d,b,a  
    14. 2  z,t  



    这是一个比较典型的行列转换,有好几种实现方法 

    1.自定义函数实现 

    Sql代码  
    1. create or replace function my_concat(n number)  
    2. return varchar2  
    3. is  
    4.  type typ_cursor is ref cursor;  
    5.  v_cursor typ_cursor;  
    6.  v_temp varchar2(10);  
    7.  v_result varchar2(4000):= '';  
    8.  v_sql varchar2(200);  
    9. begin  
    10.  v_sql := 'select a from t where i=' || n ||' order by d';  
    11.  open v_cursor for v_sql;  
    12.  loop  
    13.     fetch v_cursor into v_temp;  
    14.     exit when v_cursor%notfound;  
    15.     v_result := v_result ||',' || v_temp;  
    16.  end loop;  
    17.  return substr(v_result,2);  
    18. end;  
    19.   
    20. SQL> select i,my_concat(i) from t group by i;  
    21.   
    22.          I MY_CONCAT(I)  
    23. ---------- --------------------  
    24.          1 d,b,a  
    25.          2 z,t  



    虽然这种方式可以实现需求,但是如果表t的数据量很大,i的值又很多的情况下,因为针对每个i值都要执行一句select,扫描和排序的次数和i的值成正比,性能会非常差。 

    2.使用sys_connect_by_path 

    Sql代码  
    1. select i,ltrim(max(sys_connect_by_path(a,',')),',') a  
    2. from  
    3. (  
    4. select i,a,d,min(d) over(partition by i) d_min,  
    5. (row_number() over(order by i,d))+(dense_rank() over (order by i)) numid  
    6. from t  
    7. )  
    8. start with d=d_min connect by numid-1=prior numid  
    9. group by i;  


    从执行计划上来看,这种方式只需要扫描两次表,比自定义函数的方法,效率要高很多,尤其是表中数据量较大的时候: 
     
    3.使用wm_sys.wm_concat 
    这个函数也可以实现类似的行列转换需求,但是似乎没有办法做到直接根据另外一列排序,所以需要先通过子查询或者临时表排好序: 

    Sql代码  
    1. SQL> select i,wmsys.wm_concat(a) from t group by i;  
    2.   
    3.          I WMSYS.WM_CONCAT(A)  
    4. ---------- --------------------  
    5.          1 b,a,d  
    6.          2 z,t  
    7.   
    8. SQL> select i,wmsys.wm_concat(a)  
    9.   2  from  
    10.   3  (select * from t order by i,d)  
    11.   4  group by i;  
    12.   
    13.          I WMSYS.WM_CONCAT(A)  
    14. ---------- --------------------  
    15.          1 d,b,a  
    16.          2 z,t  


    执行计划上看,只需要做一次表扫描就可以了,但是这个函数是加密过的,执行计划并不能显示函数内部的操作。
     

    转载于:https://www.cnblogs.com/rongfengliang/p/3867826.html

    展开全文
  • SELECT listagg(PID,’,’) within group (order by PID) FROM GO where NO in (‘000484Z19080101828’, ‘000485Z19080101829’, ‘000486Z19080101830’)

    SELECT listagg(PID,’,’) within group (order by PID)
    FROM GO
    where NO in
    (‘000484Z19080101828’, ‘000485Z19080101829’,
    ‘000486Z19080101830’)

    展开全文
  • 第一层:相同wf_lot先合并一次。 比如 lotid wf_lot wf_id 10 a 5 10 a 6 10 b 7 11 a 8 11 b 9 12 a 10   第一层结果为 10 a 5 / 6 10 b 7 11 a 8 11 b 9 12 a 10...
  • 第一层:相同wf_lot先合并一次。 比如 lotid wf_lot wf_id 10 a 5 10 a 6 10 b 7 11 a 8 11 b 9 12 a 10   第一层结果为 10 a 5 / 6 10 b 7 11 a 8 11 b 9 12 a 10...
  • -- iw的算法为星期至星期日算周,且每年的第个星期为第周, -- 例如20050101为星期六,所以用iw的算法是前年的53周,而20050103之后才是第周的开始。 -- 公式 每周第天 :next_day(date) + 周 * ...
  • oracle 多行合并一行

    2016-10-28 10:26:00
    oracle 多行合并一行 sys_connect_by_path select i,ltrim(max(sys_connect_by_path(a,',')),',') afrom(select i,a,d,min(d) over(partition by i) d_min,(row_number() over(order by i,d...
  • Oracle 多行合并一行

    2019-07-25 09:12:09
    这个函数可以把结果合并一行用逗号隔开 select wmsys.wm_concat(SF) as TOP3 from ( select SF, sum(ZZTS) as ZTS from DM_YYZZSJTJ_YPZZB group by SF order by ZTS ) where rownum<=3 参考链接:...
  • demo场景,以oracle自带库中的表emp为例:select ...ENAMEDEPTNOCLARK10KING10MILLER10SMITH20ADAMS20FORD20SCOTT20JONES20ALLEN30BLAKE30MARTIN30JAMES30TURNER30WARD30现在想要将同一部门的人给合并一行记录,...
  • oracle多行合并一行

    千次阅读 2015-03-30 10:27:47
    在mysql有关键字group_concat提供了类似的...但是我希望能够显示成一行查询出来,结果图如下: 关键sql代码形如:select t.sglcheckid,**wm_concat(t.salemodulename)** from t_item_group_ex t where t.sglchecki
  • ORACLE多行合并一行

    千次阅读 2013-04-10 15:27:09
    转载地址:... 利用Oracle分析函数实现多行数据合并一行  demo场景,以oracle自带库中的表emp为例:  select ename,deptno from emp order by deptno;   ENAME DEPTNO CLARK
  • Oracle多行合并一行

    千次阅读 2009-05-11 13:56:00
    在很多情况下需要将多行合并一行,遇到问题,寻找一下解决方案1、10g下提供了wmsys.wm_concat来解决SQL> conn scott/tigerConnected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 Connected as ...
  • oracle 多行合并一行

    2014-03-14 10:21:00
    虽然这种方式可以实现需求,但是如果表t的数据量很大,i的值又很多的情况下,因为针对每个i值都要执行句select,扫描和排序的次数和i的值成正比,性能会非常差。  2.使用sys_connect_by_path   Sql代码  ...
  • oracle 返回行数太多是个闹人的问题;其实取出来到 java(或者其他语言,原谅我是程度比较低程序员)中处理最好不过了,这里介绍个函数 oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数。 用函数WMSYS.WM_...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 300
精华内容 120
关键字:

oracle多行合并一行