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函数,可直接在报表侧实现需求:
- 保留原始数据集无需修改,表格依旧按
SELECTION_NAME→COMPANY_NAME创建两层行分组,删除明细行 - 点击报表空白区域→打开「报表属性」→「代码」,粘贴以下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
- 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, "替换为你的原始数据集名称"))
- 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, "替换为你的原始数据集名称"))
- 两个列的单元格都将
CanGrow属性设为True即可
内容的提问来源于stack exchange,提问作者Delphine
相关产品推荐
相关产品推荐

