我有一个SSRS报告,可以从SQL表创建报告:
id type name
1 fruit wilk
2 fruit scot
3 paper jon
4 pen brad
5 tape lin
6 water james
该报告有两个数据集:一个为报告提供查询,另一个向参数提供数据。因此,在报告中,多值参数从dataset2获取其值。
-- dataset1::
select ID, TYPE, name from table1 where type in (@types)
-- dataset2::
select TYPE from table1
报告是根据从下拉列表中选择的类型生成的(这是一个多选列表)。
例如,如果我们选择“水果”,报告会显示:
wilk,scot
如果我们选择“水”:
詹姆斯
现在问题是我需要为所有值“TAPE”,“pen”和“paper”创建一个名称,比如名称“STATIONARY”,这样下拉列表应该只显示:
水果,静止,水
当我从下拉列表中选择“STATIONARY”时,报告应显示:
jon,brad,lin(所有3都有某种形式的固定,即纸,笔,胶带)
当我选择类型为“STATIONARY”和“water”时,它应显示:
jon,brad,lin,james
答案 0 :(得分:1)
从这里开始。
考虑在表格中添加类别字段。因此,对于你的水果和水,你可以有一个名为“食物”的类别,对于你的笔,纸和胶带,这个类别将被称为“静止”。
在报告中添加另一个名为“类别”的数据集。
SELECT Category FROM table1
添加另一个参数,该参数是名为@Category的新数据集的多重选择。
在您的主要查询中添加:
...AND Category IN (@Category)
修改强>
请记住,此建议完全忽略了数据库中的规范化。我知道这不是你问题的意图,但是你应该经常考虑这个问题。如果是我,我甚至会添加一个类别表。然后使用“table1”调用它时,我会添加一个指向类别表中ID的foriegn键。您甚至可以在类型列中看到此问题。请注意水果的使用情况不止一次。
答案 1 :(得分:0)
我要为此创建另外两个表Item
和ItemType
。
ItemType
有两个字段:ItemTypeId
(自动递增主键)和Name
。 ItemType
将具有以下值:
ItemTypeId Name
1 Food
2 Stationery
Item
有三个字段:ItemId
(自动递增主键),Name
和ItemTypeId
(来自上面的ItemType
表)。它看起来像这样:
ItemId Name ItemTypeId
1 Fruit 1
2 Paper 2
3 Pen 2
4 Tape 2
5 Water 1
将ItemId
字段添加到table1
并删除type
字段,现在看起来像:
id ItemId name
1 1 wilk
2 1 scot
3 2 jon
4 3 brad
5 4 lin
6 5 james
我们现在知道从ItemType
链接项目的类型。
创建两个参数:@ItemTypes
和@Items
作为多值。
@ItemTypes
填充ItemType
表:
SELECT ItemTypeId, Name FROM ItemType
ItemTypeId
是Value
,Name
是Label
。
@Items
从Item
表填充,但会在@ItemTypes
参数上进行过滤,如下所示:
SELECT ItemId, Name FROM Item WHERE (ItemTypeId IN @ItemTypes)
ItemId
是Value
,Name
是Label
。
现在,当您在第一个参数中选择@ItemTypes
时,第二个参数将仅显示该类型的项目。
好的,回到你的查询。您的主要查询现在看起来像:
SELECT Item.Name AS ItemName, ItemType.Name AS ItemTypeName, table1.Name
FROM table1
INNER JOIN Item ON Item.ItemId = table1.ItemId
INNER JOIN ItemType ON ItemType.ItemTypeId = Item.ItemTypeI
WHERE (ItemType.ItemTypeId IN @ItemTypes)
AND (Item.ItemId IN @Items)
我认为我们的工作已经完成。