我发布了包含按 user.name 分组的列 user.name 和 item.type 的表。我有一个多值下拉参数列出@Item。我想将结果限制为仅具有所有选定参数值的组。
Dataset1 查询是:
SELECT
user.name
, item.type
FROM
user
INNER JOIN item
ON user.name = item.user
Where item.type IN (@Type)
然后我有一个下拉参数(@Type),其中包含数据集 2 中的可用值。值字段和标签字段设置为类型。
数据集 2 查询是:
SELECT DISTINCT
item.type
数据示例:
姓名 | 项目 |
---|---|
约翰 | 片材 |
约翰 | 毯子 |
约翰 | 肥皂 |
简 | 毯子 |
丽莎 | 毯子 |
丽莎 | 片材 |
迈克 | 片材 |
如果在 @Item 中选择了 Sheet 和 Blanket,我希望得到 John 和 Lisa 的结果,如下所示:
姓名 | 项目 |
---|---|
约翰 | 片材 |
约翰 | 毯子 |
丽莎 | 毯子 |
丽莎 | 片材 |
相反,我得到:
姓名 | 项目 |
---|---|
约翰 | 片材 |
约翰 | 毯子 |
简 | 毯子 |
丽莎 | 毯子 |
丽莎 | 片材 |
迈克 | 片材 |
我正在获取在参数中选择任何值的任何用户的结果。 我只想要参数中选择了所有值的用户的结果。
由于 SSRS 将多参数值注入数据集查询的方式,这有点麻烦,它基本上用逗号分隔的值列表替换您的选择,但包含每个元素周围的引号。
这个答案背后的想法是计算传入值的数量,并与每个用户的计数进行比较。
由于 SSRS 多值处理,我们不能只计算传入的数量,因此我们有两个选择。
第一个是从项目表中获取计数,其中
type
与类型参数匹配,如下所示...
declare @user table ([Name] varchar(20))
declare @item table ([Name] varchar(20), [Type] varchar(20))
INSERT INTO @user
VALUES
('John'), ('Jane'), ('Lisa'), ('Mike')
INSERT INTO @item
VALUES
('John', 'Sheet'), ('John', 'Blanket'), ('John', 'Soap'),
('Jane', 'Blanket'),
('Lisa', 'Sheet'), ('Lisa', 'Blanket'),
('Mike', 'Sheet')
SELECT
[Name], [Type] as Item
FROM
(
SELECT
u.[Name]
, i.[Type]
, count(*) OVER(PARTITION BY u.[Name]) as ItemCount
FROM @user u
INNER JOIN @item i
ON u.[Name] = i.[Name]
WHERE i.[Type] IN (@Type)
) a
WHERE a.ItemCount = (SELECT COUNT(DISTINCT(Type)) FROM @item WHERE [Type] IN (@Type))
第二种方法是将计数作为参数传入,在这种情况下我们可以将最终的
WHERE
换成这个
WHERE a.ItemCount = @iCount
我们还必须添加
iCount
作为数据集参数并将其值设置为
=Parameters!Type.Count()
像这样...
这是报告的结果
然后选择 3 个