SSRS - 是否可以使用一个结果集的输出来创建第二个筛选结果集



>场景: 我有一段相对笨重的 TSQL 代码,我需要运行它来填充 SSRS 报告参数。要删除值字段中的重复项,我必须运行一次代码才能获得一组不同的值。然后,为了获取所有相关键,我必须使用该值再次运行代码。这真的很低效。我希望能够运行一次查询,提示用户选择适当的变量,然后检索所有相关值,而无需返回数据服务器。

例:

CREATE TABLE #mydata(
ID INT,
EmployeeName VARCHAR(100),
Dept VARCHAR(100))
INSERT #mydata
VALUES(1,'Jones', 'HR'),
(2,'Smith', 'Finance'),
(3, 'Miller', 'Finance'),
(4, 'Macpherson','HR')

如果我想显示参数列表以便某人可以选择部门,然后检索关联的 ID,我目前正在这样做:

查询 1A:

select distinct Dept from #mydata 

- 填充参数下拉列表,用户选择存储在@depts参数中

查询2A:

select ID from #mydata where Dept = @depts.

(我需要 ID 本身,因为这构成了报告中其他级联逻辑的基础)

而我真正希望能够做的是(其中一些显然是伪代码,试图呈现我正在尝试做的事情,请不要更正伪代码!!

查询 1B:

select Dept, ID from #mydata

(存储在结果集中 $1B)

查询2B:

select distinct Dept from $1B

(2B构成参数选择的基础;用户选择的参数存储在@depts)

查询3B:

select ID from $1B where Dept = @depts

或者

查询 1C:

select Dept, ID, rank() over (partition by Dept order by ID) as ranked from #mydata

(存储在结果集中 $1C)

查询2C: 结果集 $1C 按ranked=1过滤,这构成了参数选择的基础;用户选择的参数存储在@depts中。

查询3C:

select ID from $1B where Dept = @depts

这似乎是一件相当正常的事情,但我找不到任何地方描述这种需求或暗示它是 MS 所迎合的。在我放弃之前,我只是想检查是否有其他人遇到过这个问题并解决了它!

你所要求的是有道理的,我同意这是一个相对常见的要求。无法从报表本身中的一个查询中获取非重复列表和完整数据集。不过,有几种方法可以实现这一点。

第一种方法是在数据库中使用存储结果的表。例如,如果查询由于业务逻辑或聚合而花费很长时间,则使用计划的存储过程定期将结果保存在单独的表中可能是有意义的。然后,当您运行报表时,您只是查询此准备好的数据集。如果查询由于数据量很大而变慢,这可能没有多大帮助。

另一个类似的选项是在 SSRS 中使用共享数据集。这是保存查询以在多个报表中使用的一种方式。其中一个不错的功能是可以按计划缓存数据。换句话说,该查询将定期自动运行。当您去查看报表时,它不会再次访问数据库,它只是检索缓存的数据。

根据数据集的大小以及参数对数据集的影响,这实际上可能不会使报表更快。在平衡在运行报表之前可以完成多少工作以及缓存报表需要多少存储空间之间始终存在权衡。但根据您的问题,这当然是一种您应该尝试的方法,看看是否可以使其为您工作。

最新更新