如何利用现有数据集的唯一值填充SSRS参数?
问题描述
现有SSRS数据集查询语句如下:
SELECT [id], [category], [data]... FROM MyDatabase.MyTable ...
查询返回结果包含重复的category值,示例数据如下:
| ID | Category | More Data |
|---|---|---|
| 1 | foo | DATA 1... |
| 2 | bar | DATA 2... |
| 3 | foo | DATA 3... |
| 4 | bar | DATA 4... |
| 3 | baz | DATA 5... |
| 4 | bar | DATA 6... |
需要添加一个按category过滤的下拉参数,参数选项需为唯一的foo, bar, baz,但无法提前硬编码值。使用SSRS“从查询获取可用值”功能会生成重复选项,新建含SELECT DISTINCT [category]的数据集会重复查询增加负载,求可行方案。
可行方案
方案1:客户端利用自定义代码去重(无额外SQL查询)
直接在SSRS报表端对已获取的主数据集进行去重处理,无需额外执行SQL查询:
- 打开报表的「报表属性」→「代码」标签页,添加以下VB.NET函数:
Public Shared Function GetUniqueCategories(inputItems As Object()) As Object() Dim uniqueCategories As New System.Collections.Generic.HashSet(Of String)() For Each item As Object In inputItems If item IsNot Nothing Then uniqueCategories.Add(item.ToString().Trim()) End If Next Return uniqueCategories.ToArray() End Function - 新建参数(如
pCategory),进入参数属性的「可用值」标签页:- 选择「指定值」,点击「添加」
- 在「标签」和「值」的表达式框中输入:
=Code.GetUniqueCategories(LookupSet("", "", Fields!category.Value, "你的主数据集名称"))
你的主数据集名称为实际数据集名称。 - 在主数据区域的「筛选器」中添加条件:
Fields!category.Value = Parameters!pCategory.Value,实现数据过滤。
注意:此方案会先加载全量主数据,再在客户端生成参数选项并过滤数据。若主数据集数据量极大,可能影响报表加载速度,但确实避免了第二次SQL查询。
方案2:修改原SQL查询,一次返回主数据与分类元数据(单次表扫描)
通过调整原查询,让数据库仅扫描一次表,同时返回主数据和唯一分类:
-- 主数据部分 SELECT [id], [category], [data], 'main' AS data_type FROM MyDatabase.MyTable ... -- 唯一分类部分 UNION ALL SELECT NULL AS id, [category], NULL AS data, 'category' AS data_type FROM (SELECT DISTINCT [category] FROM MyDatabase.MyTable ...) t
后续配置:
- 主数据区域添加筛选器:
Fields!data_type.Value = "main",仅展示业务数据 - 参数的可用值从该数据集获取,添加筛选器:
Fields!data_type.Value = "category",确保参数选项为唯一分类值
此方案仅执行一次SQL查询,数据库层面仅扫描一次表,性能更优,适合数据量较大的场景。
内容的提问来源于stack exchange,提问作者Z Star
相关产品推荐
相关产品推荐

