You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL主视图中将多行用户数据合并为逗号分隔的单行?

合并服务关联用户为逗号分隔字符串的SQL实现

现有主表ServicesData,当前执行的查询语句为:

SELECT        SrvID, SrvTitle, SrvStatus, '' AS SrvUsersText
FROM          ServicesData

需要将每个服务对应的所有关联用户合并为逗号分隔的字符串,填充到SrvUsersText字段中。以下是主流数据库的实现方案(假设子表名为ServiceUsers,关联字段为SrvID,用户名字段为UserName):

SQL Server 版本

使用STRING_AGG函数完成字符串聚合:

SELECT 
    sd.SrvID, 
    sd.SrvTitle, 
    sd.SrvStatus,
    ISNULL(STRING_AGG(su.UserName, ', '), '') AS SrvUsersText
FROM ServicesData sd
LEFT JOIN ServiceUsers su ON sd.SrvID = su.SrvID
GROUP BY sd.SrvID, sd.SrvTitle, sd.SrvStatus
  • LEFT JOIN确保无关联用户的服务仍会被返回,ISNULL将聚合结果的NULL转为空字符串

MySQL 版本

使用GROUP_CONCAT函数:

SELECT 
    sd.SrvID, 
    sd.SrvTitle, 
    sd.SrvStatus,
    IFNULL(GROUP_CONCAT(su.UserName SEPARATOR ', '), '') AS SrvUsersText
FROM ServicesData sd
LEFT JOIN ServiceUsers su ON sd.SrvID = su.SrvID
GROUP BY sd.SrvID, sd.SrvTitle, sd.SrvStatus
  • GROUP_CONCAT默认用逗号分隔,也可通过SEPARATOR指定自定义分隔符

Oracle 版本

使用LISTAGG函数:

SELECT 
    sd.SrvID, 
    sd.SrvTitle, 
    sd.SrvStatus,
    NVL(LISTAGG(su.UserName, ', ') WITHIN GROUP (ORDER BY su.UserName), '') AS SrvUsersText
FROM ServicesData sd
LEFT JOIN ServiceUsers su ON sd.SrvID = su.SrvID
GROUP BY sd.SrvID, sd.SrvTitle, sd.SrvStatus
  • WITHIN GROUP (ORDER BY ...)可指定用户名字的排序顺序,按需调整

PostgreSQL 版本

使用STRING_AGG函数:

SELECT 
    sd.SrvID, 
    sd.SrvTitle, 
    sd.SrvStatus,
    COALESCE(STRING_AGG(su.UserName, ', '), '') AS SrvUsersText
FROM ServicesData sd
LEFT JOIN ServiceUsers su ON sd.SrvID = su.SrvID
GROUP BY sd.SrvID, sd.SrvTitle, sd.SrvStatus
  • COALESCE用于将无用户时的NULL结果转为空字符串

内容的提问来源于stack exchange,提问作者A.J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:12:48