listagg是oracle11.2增加的特性。
功能类似wmsys.wm_concat函数,即将数据分组后,把指定列的数据通过指定符号合并。
--listagg()函数,列转行。 在每个分组内,LISTAGG根据order by子句对列值进行排序,将排序后的结果拼接起来。
--基本语法;listagg(待处理列,连接符号) within group(order by 用于拼接组内排序字段)
select a.* from test_userinfo a;
--分组函数:
select a.user_sex,listagg(a.user_school,',') within group(order by a.user_age) from test_userinfo a group by a.user_sex;
--分析函数:根据年龄分区,在分区内部拼接学校,然后拼接时按照性别排序
select a.user_name,a.user_age,a.user_school,listagg(a.user_school,',') within group(order by a.user_sex) over (partition by a.user_age) from test_userinfo a;
附:LISTAGG () 和STRING_AGG () 函数的区别与简单使用
1:区别
LISTAGG 和 STRING_AGG 都是用于在 SQL 查询中将多个值合并为单个字符串的函数,但它们属于不同的数据库系统。
LISTAGG
是 Oracle 数据库中的聚合函数,用于将多行的值合并为一个字符串,并且可以指定分隔符。STRING_AGG
是 SQL Server 中的聚合函数,也用于将多行的值合并为一个字符串,并且可以指定分隔符。
2:语法结构
2.1 LISTAGG 函数的语法结构如下:
LISTAGG(expression, delimiter) WITHIN GROUP (ORDER BY order_expression) [OVER (analytic_clause)]
- expression:要合并的表达式,通常是一个列或计算值。
- delimiter:用于分隔合并的值的分隔符。
- ORDER BY order_expression:可选部分,用于指定合并的顺序。如果不提供
ORDER BY
子句,合并的顺序将不受控制。 - analytic_clause:可选部分,通常用于窗口函数。在常规用法中,这部分通常不会出现。
2.2 STRING_AGG 函数的语法结构如下:
STRING_AGG (expression, separator)
- expression:要合并的表达式,通常是一个列或计算值。
- separator:用于分隔合并的值的分隔符。
总结