LISTAGG函数 oracle_11g
sql oracle mysql 数据库 基础 知识 窗口函数 lag与lead函数 LISTAGG函数 connect by 结构化查询 备份和恢复 mysql5.7 mysql8.0 oracle_11g docker
LISTAGG函数 oracle_11g
LISTAGG函数语法:
LISTAGG (measure_expr:any [, delimiter_expr:VARCHAR]) WITHIN GROUP(ORDER BY column_expr)
语法注解:
LISTAGG函数一般配合GROUP BY作为聚合函数(也可用于开窗函数)使用,可以传入两个参数变量
measure_expr:要合并处理的字段
delimiter_expr:给定分隔符号
column_expr:排序字段
需求:统计每个客户纵向拼接消费的月份 多行纵向拼接
-- 纵向拼接字段-- 开窗函数用法
SELECT
CUS_NO,
TRAN_MONTH, -- 按客户编号开窗
LISTAGG ( TRAN_MONTH, ',' ) WITHIN GROUP ( ORDER BY TRAN_MONTH ) OVER ( PARTITION BY CUS_NO ) AS PINJIE
FROM
test2;
聚合和开窗的区别在于:
聚合函数每组只会返回一条数据(按group by的字段)
开窗函数会返回原数据所有行,但会额外增加统计字段
扩展需求:统计每个客户纵向拼接消费的月份 多列横向拼接
-- 横向拼接字段
SELECT
CUS_NO 客户编号,
TRAN_MONTH 交易月份,
TRAN_AMT 交易金额,
-- 拼接字段末尾逗号情况的处理
decode( substr( pinjie, length( pinjie ), 1 ), ',', substr( pinjie, 1, length( pinjie ) - 1 ), pinjie ) AS pinjie
FROM (
-- 使用拼接符 || 将三个字段拼接到一起
SELECT
CUS_NO,
TRAN_MONTH,
TRAN_AMT,
decode( CUS_NO, NULL, NULL, '客户编号:' || CUS_NO || ',' ) || decode( TRAN_MONTH, NULL, NULL, '交易月份:' || TRAN_MONTH || ',' ) || decode( TRAN_AMT, NULL, NULL, '交易金额:' || TRAN_AMT ) AS pinjie
FROM
test2
) a;