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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:48:02