zoukankan      html  css  js  c++  java
  • Oracle拼接同一个字段多行的值

    本文引用自-   https://www.cnblogs.com/qianyuliang/p/6649983.html

           https://blog.csdn.net/defonds/article/details/80455816

    方法一:vm_concat() 函数

    oracle wm_concat(column)函数使我们经常会使用到的,下面就教您如何使用oraclewm_concat(column)函数实现字段合并

    如:

    shopping:
    -----------------------------------------
    u_id       goods            num
    ------------------------------------------
    1                苹果               2
    2                梨子               5
    1                西瓜               4
    3                葡萄               1
    3                香蕉               1
    1                橘子               3
    =======================
     
    想要的结果为:
    --------------------------------
    u_id          goods_sum
    --------------------------------
    1              苹果,西瓜,橘子
    2              梨子
    3              葡萄,香蕉
    ---------------------------------
     代码为:select u_id, wmsys.wm_concat(goods) goods_sum   from shopping   group by u_id  
     
     
    想要的结果2:
    --------------------------------
    u_id          goods_sum
    --------------------------------
    1              苹果(2斤),西瓜(4斤),橘子(3斤)
    2              梨子(5斤)
    3              葡萄(1斤),香蕉(1斤)
    ---------------------------------
    代码为:select u_id, wmsys.wm_concat(goods || '(' || num || '斤)' ) goods_sum   from shopping   group by u_id
     
    方法二:listagg()函数

    基本语法:listagg(xxx,xxx) within group( order by xxx)。
    可以配合 group by进行聚合查询,也可以配合 partition by进行聚合查询。
    直接上例子。
    test_user表记录如下:


    test_record 表记录如下:


    期望结果:

    id name agg_values
    111 aaa 1,3
    222 bbb 1,2
    333 ccc 1,3
    配合 group by 查询语句:

    select u.id, u.name, listagg(r.value, ',') within group (order by  r.value) as agg_values
    from test_user u left outer join  test_record r on u.id = r.id
    where r.tag in ('start', 'end')
    group by u.id, u.name;
    1
    2
    3
    4
    查询结果:

    配合 partition by查询语句:

    select distinct u.id, u.name, listagg(r.value, ',') within group (order by  r.value)
    over (partition by u.id )  as agg_values
    from test_user u left outer join  test_record r on u.id = r.id
    where r.tag in ('start', 'end');
    1
    2
    3
    4
    查询结果:

    看来二者都能达成同样的目标。
    二者相似之处:

    都能实现聚合查询同样的结果
    都需要 order by 对 listagg 的对象进行排序。within group 可以对聚合后的单元内 (如上例中的 1,3) 元素进行排序,order by的字段任意,并不仅限于要进行聚合操作的字段
    二者不同:

    group by 查询结果列必须出现在 group by 后面,不然会有 ORA-00979: not a group by expression 错误
     partition by  查出的结果集是重复的 (重复数视符合条件记录数而定),需要使用 distinct 进行显式去重
    对于查询结果非常复杂的业务场景,个人感觉使用 partition by 会更灵活一些;group by 由于其查询结果列必须出现在 group by 条件里边而显得有些臃肿,不够优雅。

     
     
     
  • 相关阅读:
    数据库 proc编程三
    数据库 Proc编程二
    数据库 Proc编程一
    数据库 Oracle数据库对象二
    Your local changes to the following files would be overwritten by merge: ... Please, commit your changes or stash them before you can merge
    生活感悟关键字
    科3
    NGINX 健康检查和负载均衡机制分析
    django模板里关闭特殊字符转换,在前端以html语法渲染
    django 获取前端获取render模板渲染后的html
  • 原文地址:https://www.cnblogs.com/alvin-06/p/10868055.html
Copyright © 2011-2022 走看看