SSRS多行文本拼接时查询结果出现重复内容如何解决
问题原因
- 子查询关联条件不全:现有子查询仅关联了日期条件,未关联患者维度的匹配规则,会将当日所有患者的创面类型全部拼接返回,和外层当前行的创面类型重复叠加,导致最终结果出现重复内容。
- 分组逻辑错误:外层按日期、病历号、单个创面类型分组,会导致每个创面类型单独生成一行,每行都拼接了当日全量创面类型+当前行的创面类型,进一步放大重复问题。
- 语法冗余:外层
GROUP BY后再加DISTINCT无实际作用,无法解决逻辑层面导致的重复。
修复方案
兼容SQL Server 2008及以上版本的写法(对应你当前用的FOR XML PATH方案)
SELECT wm.Date, p.[Medical Record Number], STUFF( ( SELECT DISTINCT ' /// ' + CAST(wt.Name AS VARCHAR(MAX)) FROM dbo.[Wound Management] wm_inner INNER JOIN dbo.[Wound Type] wt ON wm_inner.[Wound Type_ID] = wt.ID WHERE wm_inner.Date = wm.Date AND wm_inner.[Owner (Patient)_Patient_ID] = p.ID FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(MAX)'), 1, 5, '' -- 移除开头多余的` /// `分隔符 ) AS Wound_Type FROM dbo.[Wound Management] wm INNER JOIN dbo.Patient p ON wm.[Owner (Patient)_Patient_ID] = p.ID GROUP BY wm.Date, p.ID, p.[Medical Record Number]
SQL Server 2017及以上版本简化写法
如果你的数据库版本支持STRING_AGG函数,可以用更简洁的写法实现需求:
SELECT wm.Date, p.[Medical Record Number], STRING_AGG(DISTINCT wt.Name, ' /// ') AS Wound_Type FROM dbo.[Wound Management] wm INNER JOIN dbo.[Wound Type] wt ON wm.[Wound Type_ID] = wt.ID INNER JOIN dbo.Patient p ON wm.[Owner (Patient)_Patient_ID] = p.ID GROUP BY wm.Date, p.ID, p.[Medical Record Number]
核心修正点
- 外层调整分组维度,按「日期+患者ID+病历号」分组,保证每个患者每天仅返回一行结果
- 子查询补充患者ID关联规则,仅拼接当前患者当日的所有创面类型,不会混入其他患者数据
- 新增
STUFF函数处理开头多余分隔符,无需在外层额外拼接当前行的创面类型 - 新增
TYPE和value配置,避免创面类型名称包含&、<等特殊字符时出现XML转义异常
内容的提问来源于stack exchange,提问作者Mezameta Yasuo
相关产品推荐
相关产品推荐

