前言#

今天要帮业务写一个取数的SQL,其中要用到分组函数,并且要取到各个分组内详细的数据,因为用到的比较少,不太清楚要怎么实现,在网上找到listagg函数可以实现,所以记录下它的应用

Listagg()详解#

概述#

listagg()函数可以实现多列记录聚合为一条记录,其实就是列转行;可以单独使用,也可以与GROUP BY一起使用
像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来

基本语法#

LISTAGG(measure_expr,delimiter) WITHIN GROUP( ORDER BY XXX)

  • measure_expr : 需要拼接汇总的列名
  • delimiter : 分隔符,默认NULL
  • ORDER BY XXX : 按照什么排序

示例

点击查看代码

高级用法#

listagg(XXX, ‘,’) within GROUP (order by XXX) over (partition by XXX) rank

能够通过【partition by】按照不同的层级划分

示例

点击查看代码

拓展#

Mysql group_concat函数#

MySQL中也有类似的函数,就是group_concat函数

基本语法#

group_concat([DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’])

示例

点击查看代码

注意#

  • Mysql的group_concat函数是可以去重的,需要结合GROUP BY使用
  • Oracle的Listagg()函数无法进行去重,如果要去重的话,可以使用下列三种方法
    • 使用wm_concat() + distinct去重聚合【oracle官方不太推荐】
    • 使用正则替换方式去重【仅适用于oracle字符串大小比较小的情况】
    • 先去重,再聚合【推荐使用】

参考博客#

 
 
转自:https://www.cnblogs.com/kssw/p/16122987.html