假设我在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
谢谢!
答案 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都会相应更新!
成功:)
再次感谢您的回答!