使用特定可用值填充下拉列表参数

时间:2012-12-17 16:23:45

标签: sql sql-server-2008 tsql reporting-services

我有一个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

2 个答案:

答案 0 :(得分:1)

从这里开始。

考虑在表格中添加类别字段。因此,对于你的水果和水,你可以有一个名为“食物”的类别,对于你的笔,纸和胶带,这个类别将被称为“静止”。

在报告中添加另一个名为“类别”的数据集。

SELECT Category FROM table1

添加另一个参数,该参数是名为@Category的新数据集的多重选择。

在您的主要查询中添加:

...AND Category IN (@Category)

修改

请记住,此建议完全忽略了数据库中的规范化。我知道这不是你问题的意图,但是你应该经常考虑这个问题。如果是我,我甚至会添加一个类别表。然后使用“table1”调用它时,我会添加一个指向类别表中ID的foriegn键。您甚至可以在类型列中看到此问题。请注意水果的使用情况不止一次。

答案 1 :(得分:0)

我要为此创建另外两个表ItemItemType

ItemType有两个字段:ItemTypeId(自动递增主键)和NameItemType将具有以下值:

ItemTypeId    Name
1             Food
2             Stationery

Item有三个字段:ItemId(自动递增主键),NameItemTypeId(来自上面的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

ItemTypeIdValueNameLabel

@ItemsItem表填充,但会在@ItemTypes参数上进行过滤,如下所示:

SELECT ItemId, Name FROM Item WHERE (ItemTypeId IN @ItemTypes)

ItemIdValueNameLabel

现在,当您在第一个参数中选择@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)

我认为我们的工作已经完成。