基于数据集的SSRS多值参数过滤器

时间:2014-06-11 16:56:08

标签: sql-server-2008 reporting-services parameters filter

假设我在SSRS中有一个名为DataSet1的数据集,如下所示:

CREATE TABLE #data 
(ID int, Value int, UserID varchar(2))
INSERT INTO #data VALUES
(1, 1000, 'AA'), 
(2, 2000, 'AA'), 
(3, 3000, 'BB'), 
(4, 2000, 'BB'), 
(5, 1500, 'BB'), 
(6, 1800, 'BB'), 
(7, 1700, 'CC')

..我的报告只是把它作为一个表格。

然后我们说我想在该报告中添加一个参数,让用户通过UserID过滤该表。我希望它是一个多值参数,他们可以选择要在报告中包含哪些用户。在这种情况下,我希望列表为AA,BB和CC。

到目前为止,我已经通过创建一个额外的基于SQL查询的数据集来完成它:

数据集1:

SELECT ID, Value, UserID
FROM table

DataSet2:

SELECT DISTINCT UserID
FROM table

然后让参数从DataSet2获取其可用值。但是,我在特定报告中的查询是一个非常长且复杂的查询,我宁愿不在两个数据集中使用。如果我必须返回并更改查询中的某些内容,我将不得不在两个地方维护它,依此类推。

简而言之:有没有办法通过以下方式获得我的参数的可用值: SELECT DISTINCT UserID FROM DataSet1

谢谢!

2 个答案:

答案 0 :(得分:0)

对于给定的数据集,您必须为参数查询设置一个单独的数据集,是的,您得到了该部分:

SELECT DISTINCT UserID
FROM TABLE

此查询将用于填充参数的下拉列表。 (允许或不允许多个值)。

主要查询:

如果您允许对@UserID参数进行多重选择,您将使用IN运算符为您写入主数据集查询,如下所示:

SELECT ID, Value, UserID
FROM table
WHERE (UserID IN (@UserID)) 

如果您只希望用户一次只能选择一个值,则可以使用类似WHERE UserID = @UserID的where子句编写上述查询。

确保正确映射变量。但是您必须为下拉列表单独查询。

答案 1 :(得分:0)

我决定在你的答案上写下我的评论,M.Ali作为我自己问题的答案,因为我找到了解决这个问题的方法。也许我没有完全解释我的问题。我知道上面的事情是如何工作的,以及如何基于一个数据集传递参数,然后通过SQL创建另一个数据集,允许或不允许多个值。我很感激你的答案!

我遇到的问题是,定义参数值列表的查询和实际数据集的查询是相同的。这是一个巨大的问题。换句话说,它表示' TABLE'在代码示例中,我有几百行代码。我的目标是不要让整个查询定义两个数据集。如果我将来必须更改查询,我将不得不在多个地方执行此操作。以下是我如何解决它:

我将主查询放在共享数据集中,而不是将其嵌入到我的报告中。然后我在我的查询中添加了row_number函数,如下所示:

SELECT ID, Value, UserID, rn = ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY UserID)
FROM *my huge query*

这意味着只有一个' rn = 1'每个UserID行。然后我回到了我的报告。然后我的原始DataSet1将指向共享数据集。 DataSet2(参数1)也将指向共享数据集,其中一个区别是我向该数据集添加了一个过滤器,表示' rn = 1'。然后我创建了一个参数,允许多个值'从DataSet2获取其值。它就像一个魅力。这样我可以在需要更新查询时转到共享数据集,DataSet1和DataSet2都会相应更新!

成功:)

再次感谢您的回答!