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

SQL Server低版本无STRING_AGG函数,求分组字符串拼接解决方案

解决SQL Server低版本无STRING_AGG时的分组拼接问题

问题原因

你提供的XML拼接代码出错的核心是子查询未与外层查询的studentid建立关联,导致子查询返回了表中所有code,最终拼接成全局的代码串,而非当前分组学生的对应code。

正确的基于XML实现代码

SELECT
    studentid,
    Codes = STUFF((
        SELECT ',' + t2.code 
        FROM dbo.testtable t2
        WHERE t2.studentid = t1.studentid -- 关键:关联外层的studentid,限定当前学生的code
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM dbo.testtable t1
GROUP BY t1.studentid
ORDER BY t1.studentid;

代码说明

  • 给外层表和子查询表分别设置别名(t1、t2),避免表名引用冲突。
  • 子查询中通过WHERE t2.studentid = t1.studentid,确保只拼接当前studentid对应的code。
  • STUFF函数用于移除拼接结果开头多余的逗号。
  • FOR XML PATH('')将子查询结果拼接为XML字符串,TYPE参数保证特殊字符(如<、>)不会被转义,最后用.value('.', 'NVARCHAR(MAX)')提取纯文本内容。

可选写法(基于CROSS APPLY)

如果你的SQL Server版本支持CROSS APPLY,可以用以下逻辑更清晰的写法:

SELECT
    t1.studentid,
    Codes = STUFF(t2.CodesXml, 1, 1, '')
FROM dbo.testtable t1
CROSS APPLY (
    SELECT ',' + code 
    FROM dbo.testtable t2
    WHERE t2.studentid = t1.studentid
    FOR XML PATH(''), TYPE
) t2(CodesXml)
GROUP BY t1.studentid, t2.CodesXml
ORDER BY t1.studentid;

内容的提问来源于stack exchange,提问作者D B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:10:54