SSRS - 我可以使用一个结果集的输出来创建第二个过滤结果集吗
SSRS - Can I use the output of one result set to create a second filtered result set
场景:
我有一段相对笨拙的 TSQL 代码,我需要 运行 填充 SSRS 报告参数。要删除值字段中的重复项,我必须 运行 代码一次以获得一组不同的值。然后,为了获得所有关联的键,我必须再次 运行 代码和值。这真的很低效。我希望能够 运行 查询一次,提示用户 select 适当的变量,然后检索所有关联的值,而不必返回到数据服务器。
示例:
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 B
(2B构成参数selection的基础;用户选择的参数存储在@depts中)
查询 3B:
select ID from B where Dept = @depts
或者
查询 1C:
select Dept, ID, rank() over (partition by Dept order by ID) as ranked from #mydata
(存储在结果集$1C)
查询2C:
结果集 $1C 由 ranked=1
过滤,这构成了参数 selection 的基础;用户选择的参数存储在@depts.
查询 3C:
select ID from B where Dept = @depts
这似乎是一件很正常的事情,但我找不到任何地方描述这种需求或暗示这是 MS 已经满足的。在我放弃之前,我只是想看看其他人是否遇到过这个问题并解决了它!
您的要求很有道理,我同意这是一个相对普遍的要求。无法从报表本身的一个查询中同时获取不同列表和完整数据集。不过,有几种方法可以实现这一目标。
第一种方法是在存储结果的数据库中使用 table。例如,如果查询由于业务逻辑或聚合而花费很长时间,则使用计划存储过程定期将结果保存在单独的 table 中可能是有意义的。然后当你 运行 报告时,你只是在查询这个准备好的数据集。如果由于数据量太大导致查询速度很慢,这可能没有多大帮助。
另一个类似的选项是在 SSRS 中使用共享数据集。这是一种保存查询以便在多个报告中使用的方法。其中一个不错的功能是可以按计划缓存数据。换句话说,该查询将定期自动 运行。当您查看报告时,它不会再次访问数据库,它只是检索缓存数据。
根据数据集的大小以及参数对其的影响,这实际上可能不会使报告更快。在报告 运行 之前可以完成多少工作以及缓存它需要多少存储空间 space 之间总是存在权衡。但是根据你的问题,这当然是你应该尝试的一种方法,看看你是否可以让它为你工作。
场景: 我有一段相对笨拙的 TSQL 代码,我需要 运行 填充 SSRS 报告参数。要删除值字段中的重复项,我必须 运行 代码一次以获得一组不同的值。然后,为了获得所有关联的键,我必须再次 运行 代码和值。这真的很低效。我希望能够 运行 查询一次,提示用户 select 适当的变量,然后检索所有关联的值,而不必返回到数据服务器。
示例:
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 B
(2B构成参数selection的基础;用户选择的参数存储在@depts中)
查询 3B:
select ID from B where Dept = @depts
或者
查询 1C:
select Dept, ID, rank() over (partition by Dept order by ID) as ranked from #mydata
(存储在结果集$1C)
查询2C:
结果集 $1C 由 ranked=1
过滤,这构成了参数 selection 的基础;用户选择的参数存储在@depts.
查询 3C:
select ID from B where Dept = @depts
这似乎是一件很正常的事情,但我找不到任何地方描述这种需求或暗示这是 MS 已经满足的。在我放弃之前,我只是想看看其他人是否遇到过这个问题并解决了它!
您的要求很有道理,我同意这是一个相对普遍的要求。无法从报表本身的一个查询中同时获取不同列表和完整数据集。不过,有几种方法可以实现这一目标。
第一种方法是在存储结果的数据库中使用 table。例如,如果查询由于业务逻辑或聚合而花费很长时间,则使用计划存储过程定期将结果保存在单独的 table 中可能是有意义的。然后当你 运行 报告时,你只是在查询这个准备好的数据集。如果由于数据量太大导致查询速度很慢,这可能没有多大帮助。
另一个类似的选项是在 SSRS 中使用共享数据集。这是一种保存查询以便在多个报告中使用的方法。其中一个不错的功能是可以按计划缓存数据。换句话说,该查询将定期自动 运行。当您查看报告时,它不会再次访问数据库,它只是检索缓存数据。
根据数据集的大小以及参数对其的影响,这实际上可能不会使报告更快。在报告 运行 之前可以完成多少工作以及缓存它需要多少存储空间 space 之间总是存在权衡。但是根据你的问题,这当然是你应该尝试的一种方法,看看你是否可以让它为你工作。