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

使用多STUFF语句实现SQL分组聚合多行数据问题求助

解决方案

原代码问题

你的代码无法得到正确结果的核心原因是:

  • GROUP BY子句包含了CPT、SVCDate、Vendor,导致SQL按每一行的唯一字段组合分组,而非按ID聚合,最终输出的是原始行加上冗余的聚合字段。
  • SELECT中保留了原表的单个字段值,这不是你需要的聚合后结果。

修正后的SQL实现

写法一:使用GROUP BY ID

SELECT 
    D1.ID,
    -- 聚合CPT字段
    STUFF((
        SELECT ', ' + CD.CPT
        FROM Claims CD
        WHERE CD.ID = D1.ID
        FOR XML PATH ('')
    ), 1, 2, '') AS CPT,
    -- 聚合SVCDate字段(统一日期格式)
    STUFF((
        SELECT ', ' + CONVERT(VARCHAR(10), CD1.SVCDate, 101)
        FROM Claims CD1
        WHERE CD1.ID = D1.ID
        FOR XML PATH ('')
    ), 1, 2, '') AS SVCDate,
    -- 聚合Vendor字段
    STUFF((
        SELECT ', ' + CD2.Vendor
        FROM Claims CD2
        WHERE CD2.ID = D1.ID
        FOR XML PATH ('')
    ), 1, 2, '') AS Vendor
FROM Claims D1
GROUP BY D1.ID

写法二:使用DISTINCT ID

如果你的SQL环境对GROUP BY有特殊限制,也可以用DISTINCT替代:

SELECT DISTINCT
    D1.ID,
    STUFF((
        SELECT ', ' + CD.CPT
        FROM Claims CD
        WHERE CD.ID = D1.ID
        FOR XML PATH ('')
    ), 1, 2, '') AS CPT,
    STUFF((
        SELECT ', ' + CONVERT(VARCHAR(10), CD1.SVCDate, 101)
        FROM Claims CD1
        WHERE CD1.ID = D1.ID
        FOR XML PATH ('')
    ), 1, 2, '') AS SVCDate,
    STUFF((
        SELECT ', ' + CD2.Vendor
        FROM Claims CD2
        WHERE CD2.ID = D1.ID
        FOR XML PATH ('')
    ), 1, 2, '') AS Vendor
FROM Claims D1

关键细节说明

  1. 分组逻辑:只按ID分组(或用DISTINCT去重),确保每个ID仅输出一行聚合结果。
  2. 日期转换:用CONVERT(VARCHAR(10), SVCDate, 101)将日期转为统一的MM/DD/YYYY格式,避免因日期类型默认转换导致的格式混乱。
  3. STUFF作用:移除拼接字符串开头多余的, (从第1位开始删除2个字符),让结果格式更整洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:35:26