SSRS技术问询:如何在父行组页脚生成动态值列表及计数
解决SSRS父行组页脚动态生成原因计数列表的思路
1. 单查询预处理数据(核心基础)
先调整数据源查询,在保留明细数据的同时,提前聚合每个PropA对应的原因及计数,避免报表端复杂计算:
SELECT t.PropA, t.Reason, t.OtherColumns, -- 聚合当前PropA下所有原因的计数,SQL Server 2017+可用STRING_AGG agg.ReasonCounts FROM YourTable t LEFT JOIN ( SELECT PropA, STRING_AGG(CONCAT(Reason, ':', COUNT(*)), ' | ') AS ReasonCounts FROM YourTable GROUP BY PropA, Reason GROUP BY PropA ) agg ON t.PropA = agg.PropA
如果是SQL Server 2016及以下,替换STRING_AGG为STUFF+FOR XML PATH的拼接方式即可。
2. 用矩阵控件实现动态透视效果
这是最直接的方案,避免列跨度错误:
- 在父行组的页脚区域插入矩阵控件。
- 矩阵的列组绑定
Reason字段,值区域设置为COUNT(Reason)(汇总方式选Count)。 - 给矩阵添加筛选器:设置
PropA等于当前父组的=Fields!PropA.Value,确保只统计当前组内的原因。 - 开启矩阵的「自动调整列宽」,避免列溢出或跨度错误。
3. 用LIST组件+自定义代码实现列表式计数
如果偏好列表样式,通过LookupSet和自定义代码处理:
- 添加自定义代码:打开报表属性→代码,插入以下VB代码:
Public Function CountOccurrences(arr As Object(), value As String) As Integer Dim count As Integer = 0 For Each item In arr If item.ToString() = value Then count += 1 Next Return count End Function Public Function GetUniqueReasons(arr As Object()) As Object() Dim uniqueList As New System.Collections.ArrayList() For Each item In arr If Not uniqueList.Contains(item.ToString()) Then uniqueList.Add(item.ToString()) End If Next Return uniqueList.ToArray() End Function - 配置LIST控件:
- 在父组页脚插入LIST,绑定原数据集。
- 给LIST添加行组,组表达式设为:
=Code.GetUniqueReasons(LookupSet(Fields!PropA.Value, Fields!PropA.Value, Fields!Reason.Value, "YourDataset")) - 在LIST的文本框中显示原因和计数:
=Fields!Reason.Value & ": " & Code.CountOccurrences(LookupSet(Fields!PropA.Value, Fields!PropA.Value, Fields!Reason.Value, "YourDataset"), Fields!Reason.Value)
关键注意事项
- 矩阵或LIST的筛选/组表达式必须严格关联当前父组的
PropA,否则会显示全量数据。 - 若数据集量大,优先用查询预处理聚合结果,减少报表端计算压力。
内容的提问来源于stack exchange,提问作者Mike C
相关产品推荐
相关产品推荐

