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

T-SQL中合并相同ID且包含XML列的数据行的技术咨询

解决方案:合并相同ID行并拼接_eachIndividual列

当然可以实现你的需求!针对SQL Server环境,根据你使用的版本,有两种常用的方法:

方法1:使用STRING_AGG(SQL Server 2017及以上版本)

这是最简洁的方式,利用STRING_AGG函数直接拼接同一分组下的_eachIndividual值:

SELECT 
    _ID,
    MAX(_xml) AS _xml, -- 同一ID下值完全相同,MAX/MIN都能拿到正确结果
    MAX(_indivisualCommaList) AS _indivisualCommaList,
    STRING_AGG(_eachIndividual, ',') AS _eachIndividual
FROM @tblData 
WHERE _ID = @AssetID
GROUP BY _ID;

为什么用MAX()包裹其他列?

因为你明确说明同一_ID下的_xml和_indivisualCommaList值完全一致,用聚合函数(比如MAX())包裹它们,就能满足SQL Server的GROUP BY规则——所有非GROUP BY列必须被聚合函数处理。由于所有行的该列值相同,聚合后的结果和原数据完全一致。

方法2:使用STUFF + FOR XML PATH(兼容SQL Server 2016及更早版本)

如果你的SQL Server版本不支持STRING_AGG,可以用传统的XML拼接方式:

SELECT 
    _ID,
    _xml,
    _indivisualCommaList,
    STUFF((
        SELECT ',' + _eachIndividual
        FROM @tblData t2
        WHERE t2._ID = t1._ID
        FOR XML PATH(''), TYPE
    ).value('.', 'VARCHAR(MAX)'), 1, 1, '') AS _eachIndividual
FROM @tblData t1
WHERE _ID = @AssetID
GROUP BY _ID, _xml, _indivisualCommaList;

这个方法的逻辑:

  1. 子查询通过FOR XML PATH('')把同一ID下的_eachIndividual拼接成带前缀逗号的字符串(比如,768-hER-382,908-YTY-354)
  2. STUFF函数去掉开头的第一个逗号,得到干净的拼接结果
  3. 因为同一ID下的_xml和_indivisualCommaList值相同,所以把它们加入GROUP BY也不会产生多余分组

关于你之前的错误

你之前的查询只GROUP BY _ID,但SELECT里包含了_xml等非聚合列,SQL Server要求这些列要么在GROUP BY子句中,要么被聚合函数包裹,所以才会抛出那个错误。上面的两种方法都解决了这个问题,同时满足了你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:12:48