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

SSRS同一SQL请求按Selection>Company分组实现双列去重展示

可行实现方案

方案1:SQL层预处理(更推荐,性能更稳定)

直接在原始数据集的SQL查询中完成分组合并,避免SSRS侧做复杂计算,逻辑如下:

  • 按SELECTION_NAME、COMPANY_NAME分组
  • 用SQL字符串聚合函数将去重后的CONDUCTORS_NAME、ACCESSORS_NAME分别拼接为换行分隔的字符串

如果使用SQL Server 2017及以上版本,直接用STRING_AGG:

SELECT 
  SELECTION_NAME,
  COMPANY_NAME,
  STRING_AGG(DISTINCT CONDUCTORS_NAME, CHAR(10)) AS CONDUCTORS_LIST,
  STRING_AGG(DISTINCT ACCESSORS_NAME, CHAR(10)) AS ACCESSORS_LIST
FROM 你的原始表名
GROUP BY SELECTION_NAME, COMPANY_NAME
ORDER BY SELECTION_NAME, COMPANY_NAME

如果使用更低版本的SQL Server,用FOR XML PATH实现聚合:

SELECT 
  t1.SELECTION_NAME,
  t1.COMPANY_NAME,
  STUFF((SELECT DISTINCT CHAR(10) + CONDUCTORS_NAME 
         FROM 你的原始表名 t2 
         WHERE t2.SELECTION_NAME = t1.SELECTION_NAME AND t2.COMPANY_NAME = t1.COMPANY_NAME
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS CONDUCTORS_LIST,
  STUFF((SELECT DISTINCT CHAR(10) + ACCESSORS_NAME 
         FROM 你的原始表名 t2 
         WHERE t2.SELECTION_NAME = t1.SELECTION_NAME AND t2.COMPANY_NAME = t1.COMPANY_NAME
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS ACCESSORS_LIST
FROM 你的原始表名 t1
GROUP BY t1.SELECTION_NAME, t1.COMPANY_NAME
ORDER BY t1.SELECTION_NAME, t1.COMPANY_NAME

SSRS侧配置:

  • 新建表格,按SELECTION_NAME→COMPANY_NAME创建两层行分组,删除明细行
  • 将CONDUCTORS_LIST和ACCESSORS_LIST分别放到对应列的单元格
  • 选中两个单元格,在属性窗口将CanGrow设为True,打开「占位符属性」→「常规」→勾选「将HTML标记解释为样式」,即可实现每个值单独占一行的效果
  • 分组列的SELECTION_NAME、COMPANY_NAME默认仅在分组首行显示,符合需求

方案2:SSRS侧纯表达式实现(无需修改SQL)

VS2010对应的SSRS版本支持LookupSet函数,可直接在报表侧实现需求:

  1. 保留原始数据集无需修改,表格依旧按SELECTION_NAME→COMPANY_NAME创建两层行分组,删除明细行
  2. 点击报表空白区域→打开「报表属性」→「代码」,粘贴以下VB自定义去重函数:
Public Function DistinctList(ByVal items As Object()) As String
  Dim dict As System.Collections.Generic.Dictionary(Of String, Boolean) = New System.Collections.Generic.Dictionary(Of String, Boolean)
  For Each item As Object In items
    If Not IsNothing(item) AndAlso Not dict.ContainsKey(item.ToString()) Then
      dict.Add(item.ToString(), True)
    End If
  Next
  Return Join(dict.Keys.ToArray(), vbCrLf)
End Function
  1. CONDUCTORS_NAME列输入表达式:
=Code.DistinctList(LookupSet(Fields!SELECTION_NAME.Value & "|" & Fields!COMPANY_NAME.Value,
  Fields!SELECTION_NAME.Value & "|" & Fields!COMPANY_NAME.Value,
  Fields!CONDUCTORS_NAME.Value,
  "替换为你的原始数据集名称"))
  1. ACCESSORS_NAME列输入表达式:
=Code.DistinctList(LookupSet(Fields!SELECTION_NAME.Value & "|" & Fields!COMPANY_NAME.Value,
  Fields!SELECTION_NAME.Value & "|" & Fields!COMPANY_NAME.Value,
  Fields!ACCESSORS_NAME.Value,
  "替换为你的原始数据集名称"))
  1. 两个列的单元格都将CanGrow属性设为True即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:36:04