【问题标题】:Fill a drop-down list parameter with specific available values使用特定的可用值填充下拉列表参数
【发布时间】:2012-12-17 16:23:45
【问题描述】:

我有一个从 SQL 表创建报告的 SSRS 报告:

 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

报告是根据从下拉列表(多选列表)中选择的类型生成的。

例如,如果我们选择“水果”,报告将显示:

威尔克,苏格兰人

如果我们选择“水”:

詹姆斯

现在问题是我需要为所有值“TAPE”、“pen”和“paper”创建一个名称,例如名称“STATIONARY”,这样下拉列表应该只显示:

水果,静止的,​​水

当我从下拉列表中选择“STATIONARY”时,报告应显示:

jon, brad, lin(所有 3 人都有某种形式的文具,即纸、笔、胶带)

当我选择类型为“STATIONARY”和“water”时,它应该显示:

乔恩、布拉德、林、詹姆斯

【问题讨论】:

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


    【解决方案1】:

    刚刚从这里。

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

    将另一个数据集添加到您的报告中,称为“类别”。

    SELECT Category FROM table1
    

    添加另一个名为@Category 的新数据集的多项选择参数。

    在您的主查询中添加:

    ...AND Category IN (@Category)
    

    编辑

    请记住,此建议完全忽略了数据库中的规范化。我知道这不是您的问题的意图,但这是您应该始终考虑的问题。如果是我,我什至会添加一个类别表。然后使用您所说的“table1”,我将在类别表中添加一个指向 ID 的外键。您甚至可以在类型列中看到此问题。注意水果是如何被多次使用的。

    【讨论】:

    • +1,这个问题听起来很像,最好的答案是首先在数据库中做一些规范化工作,让 SSRS 问题很容易解决。
    • 完全同意。我永远不知道是否有人会遇到数据库问题,或者是否有幸进行这些快速修改以使项目走上正轨。
    【解决方案2】:

    我会为此创建另外几个表,称为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 作为多值。

    @ItemTypesItemType 表中填充:

    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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多