精华内容
下载资源
问答
  • oracle分组合并字段

    2020-07-22 13:52:05
    分组合并前: select s.loanid, s.impawtype, s.guartype from LOAN_LOANFORMASSURE s where s.LOANID = 4449 分组合并后: select loanid, (listagg(impawtype, ',') within group(ORDER BY loanid)) ...

    分组合并前:

    select  s.loanid, s.impawtype, s.guartype
      from LOAN_LOANFORMASSURE s
     where s.LOANID = 4449

    分组合并后

    select loanid,
           (listagg(impawtype, ',') within group(ORDER BY loanid)) impawtypes,
           (listagg(guartype, ',') within group(ORDER BY loanid)) guartypes
      from LOAN_LOANFORMASSURE 
     group by loanid
    having loanid = 4449


     

    展开全文
  • 本文将讲解一下oracle 11g合并数据的两种方法 (wm_concat() 和 listagg())。示例: --with as 相当于一张临时表(一次分析,多次使用) with temp as (select 'male' as sex, 'zhangsan' as stu_name f...

    一、简介

    在实际项目中进行一些统计数据时,难免会遇到需要合并数据在列表进行展示的需求。本文将讲解一下oracle 11g合并数据的两种方法 (wm_concat() 和 listagg())。示例:

    --with as 相当于一张临时表(一次分析,多次使用)  
    with temp as
     (select 'male' as sex, 'zhangsan' as stu_name
        from dual
      union
      select 'male' as sex, 'lisi' as stu_name
        from dual
      union
      select 'female' as sex, 'xiaohong' as stu_name
        from dual
      union
      select 'female' as sex, 'xiaozhang' as stu_name
        from dual
      union
      select 'male' as sex, 'zhaoliu' as stu_name
        from dual)
        
    select t.* from temp t;

    在没有合并数据之前,数据查询出来可能有一些字段重复,如下图:

    下面将性别相同的合并起来进行展示。

    二、第一种方法: wm_concat() 

    --with as 相当于一张临时表(一次分析,多次使用)  
    with temp as
     (select 'male' as sex, 'zhangsan' as stu_name
        from dual
      union
      select 'male' as sex, 'lisi' as stu_name
        from dual
      union
      select 'female' as sex, 'xiaohong' as stu_name
        from dual
      union
      select 'female' as sex, 'xiaozhang' as stu_name
        from dual
      union
      select 'male' as sex, 'zhaoliu' as stu_name
        from dual)
        
    --第一种方法: 使用 wm_concat()方法进行合并,默认以逗号分隔   
    select t.sex as sex, wm_concat(t.stu_name) as stu_name
      from temp t
     group by t.sex;

    查询结果:

    如果想替换分隔的字符:

    --with as 相当于一张临时表(一次分析,多次使用)  
    with temp as
     (select 'male' as sex, 'zhangsan' as stu_name
        from dual
      union
      select 'male' as sex, 'lisi' as stu_name
        from dual
      union
      select 'female' as sex, 'xiaohong' as stu_name
        from dual
      union
      select 'female' as sex, 'xiaozhang' as stu_name
        from dual
      union
      select 'male' as sex, 'zhaoliu' as stu_name
        from dual)
        
    --如果不想使用逗号分隔,可以替换成其他字符
    select t.sex as sex, replace(wm_concat(t.stu_name), ',', '|') as stu_name
      from temp t
     group by t.sex;

    查询结果:

    三、第二种方法: listagg()

    --with as 相当于一张临时表(一次分析,多次使用)  
    with temp as
     (select 'male' as sex, 'zhangsan' as stu_name
        from dual
      union
      select 'male' as sex, 'lisi' as stu_name
        from dual
      union
      select 'female' as sex, 'xiaohong' as stu_name
        from dual
      union
      select 'female' as sex, 'xiaozhang' as stu_name
        from dual
      union
      select 'male' as sex, 'zhaoliu' as stu_name
        from dual)
        
    --第二种方法: 使用listagg()方法,可以指定分隔的字符
    select t.sex as sex,
           listagg(t.stu_name,',') within group(order by t.stu_name) as stu_name
      from temp t
     group by t.sex;

    注意: 需要加上within group(order by ...)

    查询结果:

    如果想用别的分隔字符,直接指定即可:

    --with as 相当于一张临时表(一次分析,多次使用)  
    with temp as
     (select 'male' as sex, 'zhangsan' as stu_name
        from dual
      union
      select 'male' as sex, 'lisi' as stu_name
        from dual
      union
      select 'female' as sex, 'xiaohong' as stu_name
        from dual
      union
      select 'female' as sex, 'xiaozhang' as stu_name
        from dual
      union
      select 'male' as sex, 'zhaoliu' as stu_name
        from dual)
        
    --如果需要替换分隔字符,直接指定其他字符即可
    select t.sex as sex,
           listagg(t.stu_name,'|') within group(order by t.stu_name) as stu_name
      from temp t
     group by t.sex;
    

    查询结果:

    四、总结

    以上是关于oracle 合并数据的两种方法,本文是作者在实际项目中遇到这样的需求进行的一些在总结和方法,仅供大家学习参考,共同学习共同进步。

    展开全文
  • 表:table id name 1 a 1 b 查询分组组合语句 select id,wmsys.wm_concat(name) as namef...

     表:table

    idname
    1a
    1b

     

     

    查询分组组合语句

    select id,wmsys.wm_concat(name) as name from table group by id

    结果

    idname
    1a,b

     

     

     

    转载于:https://my.oschina.net/papio/blog/997743

    展开全文
  • Oracle同行合并分组

    2017-11-15 21:51:00
    Oracle同行合并分组 使用函数sys_connect_by_path(column,'')的例子^^。 表结构为: create table test( bookid char(3) not null, author varchar2(10) not null ); insert into test values('001...

     Oracle同行合并分组

             使用函数sys_connect_by_path(column,'')的例子^^。
     
    表结构为:
    create table test(
    bookid char(3) not null,
    author varchar2(10) not null
    );
     
    insert into test values('001','jack');
    insert into test values('001','tom');
    insert into test values('002','wang');
    insert into test values('002','zhang');
    insert into test values('002','li');
     
    commit;
     
    select * from test;
    显示结果为:
    BOO AUTHOR
    -----------------
    001 jack
    001 tom
    002 wang
    002 zhang
    002 li
     
    我们想得到的结果为:
    BOO AUTHOR
    -----------------------------
    001 jack&&tom
    002 wang&&zhang&&li
     
    SQL 文为:

    select bookid,substr(max(sys_connect_by_path(author,'&&')),3) author

    from

    (select bookid,author,id,lag(id) over(partition by bookid order by id) pid

    --(最后一列或者为)lead(id) over(partition by bookid order by id desc) pid

    from (select bookid,author,rownum id from test))

    start with pid is null
    connect by prior id=pid
    group by bookid;
     
    详细解释:
    sys_connect_by_path(column,'')//column为列名,''中间加要添加的字符
    这个函数本身不是用来给我们做结果集连接的(合并行),而是用来构造树路径的,所以需要和connect by一起使用。
     
    test只是张普通表,怎样才能变成树结构呢?我们需要加一个pid和id。
     
    id我们只需加一个rownum就好。
    select bookid,author,rownum id from test;
    BOO AUTHOR           ID
    ----------------------------
    001 jack             1
    001 tom              2
    002 wang             3
    002 zhang            4
    002 li               5
     
    而pid上一条记录不就是下一条记录的父节点了。这里我们需要函数lag()取前记录,和lead()相对。
    //把lag(id) over(order by id) pid改成lead(id) over(order by id desc) pid效果一样

    select bookid,author,id,lag(id) over(order by id) pid

    from (select bookid,author,rownum id from test);

    BOO AUTHOR           ID              PID
    -------------------------------------------
    001 jack             1
    001 tom              2                1
    002 wang             3                2
    002 zhang            4                3
    002 li               5                4
     
    由于要按bookid分我们的pid,在分析函数over中我们需要加上partition by,一看下面结果我们就知道有什么不同了。

    select bookid,author,id,lag(id) over(partition by bookid order by id) pid

    from (select bookid,author,rownum id from test);

    BOO AUTHOR           ID              PID
    -------------------------------------------
    001 jack             1
    001 tom              2                1
    002 wang             3
    002 zhang            4                3
    002 li               5                4
     
    继续,把上述看成一张虚拟表,用到我们的sys_connect_by_path函数取出想要的值。
    格式:
    sys_connect_by_path(column,'')
    start with 条件1
    connect by 条件2(prior 子节点=父节点)
     

    select bookid,sys_connect_by_path(author,'&&') author

    from

    (select bookid,author,id,lag(id) over(partition by bookid order by id) pid

    from (select bookid,author,rownum id from test))

    start with pid is null
    connect by prior id=pid;
    BOO AUTHOR
    -----------------------------------
    001 &&jack
    001 &&jack&&tom
    002 &&wang
    002 &&wang&&zhang

    002 &&wang&&zhang&&li

     
    OK,离我们的结果越来越近了,现在就是一般函数的应用了。
    1,以bookid分组,取author的最大值。
    2,用substr(string,start,length)截掉前面多余的字符。//没第三参数默认取到结束

    select bookid,substr(max(sys_connect_by_path(author,'&&')),3) author

    ......
    group by bookid;//详细sql文,一开始已给出!
    BOO AUTHOR
    ------------------------------
    001 jack&&tom
     
    002 wang&&zhang&&li
     
    大功告成,^_^!
    drop table test;
     

     


         本文转自winorlose2000 51CTO博客,原文链接:http://blog.51cto.com/vaero/790594,如需转载请自行联系原作者




    展开全文
  • select wmsys.wm_concat(distinct 字段) as 字段别名 from table t group by 字段
  • oracle sql分组合并

    千次阅读 2015-08-15 13:34:01
    Sql代码 ORACLE 分组多行合并一行 - winner - 宇宙的尽头的博客 create or replace function my_concat(mid in integer) return varchar2 --记住:参数和返回值里的数据类型都不用定义长度 is result varchar2...
  • oracle中,使用wm_concat(column)函数,可以进行字段值合并合并的字段默认通过逗号分隔,也可自行指定。如:wm_concat(col1);replace(wm_concat(col1),',','|'); --自定义分隔号,使用replace将逗号进行替换(wm_...
  • oracle 单列数据分组合并

    千次阅读 2017-11-17 14:16:42
    oracle由于版本的问题,一些函数不会相互兼容。 当我们在不知道自己的所使用的oracle是什么版本的时候可以通过下面的这个语句查询下在使用具体的函数。select * from v$version;在oracle10g中wn_concat()函数是可以...
  • 关键字row_number() over (partition by)例如,下面的数据, 这是按照name分组后,展示property值。我们想得到这样的值;第一步:将每一组的property标上序号select name,property,row_number() over (partition by ...
  • oracle分组合并其中一个字段

    千次阅读 2014-02-09 09:16:45
    分组合并每个组的 cleck_name 和 userId 另一个实例: 来自http://blog.sina.com.cn/s/blog_56d8ea900100zlwv.html 数据库的结构如下: no      item 01      AA 01      ...
  • 1、 SELECT wmsys.wm_concat(t.org) orgs, t.area_nameFROM (SELECT concat(concat(b.abbreviation, '-'), b.org_name) org,a.area_name area_nameFROM t_organization bleft join t_area_store aon a.store_code =...
  • 使用wm_concat函数 select TLXCONTENT ,wm_concat(RADDRESS) as RADDRESS from t_sendtlx where cdat between '20200101000000' and '20200330235959' and ctyp='DEP' group by TLXCONTENT;
  • 合并为如下样式: ID V1 V2 V3 a 1 2 3 b 3 2 1         SQL如下: select t.id,  max(case(t.date) when '2016-10-01' then t.value end) as v1,  max(case(t.date)...
  • 要将ta和tb中的数据合并,如果ta和tb中id相同的话,则把num1和num2相加,开始没想要分组, 其实很简单,sql如下: select sum(num1), id1 from (select * from TESTA a Union All select * from TESTB b) group by ...
  •  注意:为了显示更直观,如下查询已皆按相应分组排序  1.按年份分组  select to_char(exportDate,'yyyy'),sum(amount) from table1 group by to_char(exportDate,'yyyy');  年份 数量  --------------...
  • 实例:对相同id进行分组,并合并OBJ。 ID OBJ 1 国文 2 历史 3 生物 1 美术 3 音乐 3 体育 2 美术 2 英文 1 数学 4 化学 1 物理 结果:如下所示,显示不同id的学生选择的课程,课程...
  • 由于业务需求需要对表中的数据进行分组后进行合并的处理,鉴于Oracle10g没有现成的函数实现该功能,且该功能如若用JAVA代码实现会比较复杂,因此,特将SQL语言的实现方式分享出来,希望对大家有所帮助。如下: 表...
  • ACCESS 分组合并

    2017-10-25 22:16:33
    由于ACCESS 没有oracle的listagg函数,也没有sql server这种 for xml path 这种, 要实现分组合并需要自定义一个函数,理解了 for xml path 这个就很好理解了。
  • 表数据示例 a b c d 1 b1 c1 d1 1 b2 c2 d2 2 b3 c3 d3 2 b4 c4 d4 想要效果: 1 b1-c1-d1,b2,c2,d2 ...select deptno,wm_concat(ename) from emp group by deptno;--更具deptno分组合并所有ename显示 w...
  • Oracle分组函数

    千次阅读 2018-06-05 08:34:24
    1.分组函数: 多行函数\聚合函数:就是对一组中的数据进行处理获取一个结果2. max min sum avg count 自动忽略null值 select count(comm) from emp; 43.注意: sum() avg() 只能对数值操作 max() min() 只对 日期和...
  • oracle多行合并

    2013-03-04 17:26:54
    oracle还是很强大的,今天需要用到一个sql需对分组数据进行合并,没想到oracle有直接写好的方法 再次记录下拉先 [code="sql"] SELECT n_sec_code, wmsys.wm_concat (c_researcher_code) as result FROM ...
  • oracle 记录合并

    2010-09-08 12:52:33
    在一个表中,其中几个字段的值是一样的,按照这几个字段进行分组合并数据。 表A id name role 1 张三 系统管理员 2 张三 配置员 3 李四 需求回复人 ...
  • Oracle 分组拼接字符串

    2021-04-17 22:02:44
    oracle 根据分组拼接字符串,以指定分隔符分割,有两种方式 1)第一种方式,使用 listagg 函数 例子如下: select field1, field2,listagg(field,seperator) within group(order by sortFiled) group by field1, ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,426
精华内容 6,970
关键字:

oracle分组合并