SQL多行值合并一行字符串逗号分隔(LISTAGG )

问题:

假设我们有一张学生表:姓名,科目,成绩。

在查询的SQL使用中我们可能会有这样一种需求:展示学生姓名和科目成绩,科目成绩用逗号分隔。

实际上也就是将这个学生的所有成绩记录转换为一条记录展示出来。

就可以使用这个SQL:

SELECT 姓名, LISTAGG(成绩, ',') WITHIN GROUP (ORDER BY 科目) AS 科目成绩
FROM 学生表
GROUP BY 姓名;

这个查询首先选择了 “姓名” 字段,然后使用 LISTAGG函数将相同学生的 “成绩” 字段值以逗号分隔的形式合并成一个字符串,并按照 “科目” 字段的顺序进行排序。

LISTAGG 

LISTAGG 是一个用于聚合操作的字符串函数,它在Oracle数据库系统中可用,当然达梦也可以。该函数用于将多个行中的值连接为一个字符串,并且可以指定分隔符来分隔每个值。

通常语法如下:

LISTAGG(expression, delimiter) WITHIN GROUP (ORDER BY column)
  • expression 是要连接的列或表达式。
  • delimiter 是用于分隔每个值的字符串。
  • WITHIN GROUP 子句用于指定对结果进行排序的列。可以选择省略此子句。
  • ORDER BY 子句用于指定排序的顺序。

LISTAGG 函数将具有相同分组键的行的值连接起来,并使用指定的分隔符将它们分隔开。这非常适用于将多个值合并为一个字符串,常用于生成逗号分隔的列表。

实例:

如图我们看到这个查询结果中parti_name字段有多个数据,现在我们把它转换为一条记录查询出来且用逗号隔开。

SELECT uuid as uuid, LISTAGG(parti_name, ',') WITHIN GROUP ( ORDER BY DISPLAYORDER) AS parti_name
		FROM PARTICIPA 
 GROUP BY uuid 

结果:

注意:

LISTAGG 聚合函数是 Oracle 数据库中的特定函数,用于将多个行的值进行连接。

因此,LISTAGG 函数可以在 Oracle 数据库中使用,并且从 Oracle 11g 版本开始可用。

在其他数据库系统中,可能会有类似的函数用于字符串聚合操作,但具体的函数名称、语法和用法可能会有所不同。如下是一些其他数据库系统中类似 LISTAGG 的函数,有类似需求可百度求解:

  1. MySQL:GROUP_CONCAT
  2. SQL Server:STRING_AGG
  3. PostgreSQL:STRING_AGG
  4. IBM DB2:LISTAGG
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值