1

我正在尝试在 SSRS 中创建一个报告,其中我有一个矩阵,该矩阵将性别作为列标题,并将年龄组明确定义为行。报告按日期排序(即,显示的记录按 modifedAt 值过滤)。我的问题是我希望显示所有年龄组类别,即使数据集没有返回该行的任何数据。

因此,例如,如果我将日期设置为没有 db 行的日期,其中有 Age5-16 的孩子 - 我仍然想显示类别名称,但只是让与该行相关的单元格显示' 0'。相反,报告只是删除了整行,因为显然查询不返回任何数据。

是否有一个单独的数据集来带回整个类别列表然后以某种方式将它们组合在一起的解决方案?我被困在这里,所以任何帮助表示赞赏!

4

2 回答 2

3

我可以想到几种方法来做到这一点:

数据集级别

不仅要返回 DataSet 中基础数据中的相关数据,还应包括您希望在所有情况下显示的所有类别。

inner例如,对于数据库查询,它可能是 an和之间的区别left join,即来自以下内容:

select *
from AgeGroup
  inner join MyData on ...

至:

select *
from AgeGroup
  left join MyData on ...

所以报告总是有所有年龄组要显示。有NULL值的地方,只显示0。

如果您可以控制 DataSet,我认为这是最好的选择 - 您根本不必更新您的报告,幸运的是,实际的 DataSet 更改应该是最小的,仍然只有一个 DataSet 调用,而且到目前为止最简单的维护。

硬代码组到报告中

在这里,您为要显示的每个组包含一个表格标题行,因此在所有情况下都始终显示这些行。

在这里,您有某种条件表达式来显示值,例如对于每个组行,它将针对该组进行定制:

=Sum(IIf(Fields!AgeGroup.Value = "5-16", Fields!Amount.Value, Nothing)

这不太灵活,并且在您更改组时需要更新,并且没有那么多的布局选项。仍然只有一个 DataSet 调用,所以这是一个优点。

子报表

您可以有一个父数据集,为每个年龄组显示一行,然后在每一行中嵌入一个子报表,以显示该行所需的数据。

这使您可以灵活地布局,但会增加报告的复杂性,并且意味着您需要进行大量 DataSet 调用,而其他选项可以避免这些调用。

于 2013-06-27T13:19:18.263 回答
2

我知道这很旧,但我想详细说明 Ian 在上面的第 1 节中使用数据集级别的连接。(他的回答对我正在编写的报告非常有帮助。)

每个操作:

是否有一个单独的数据集来带回整个类别列表然后以某种方式将它们组合在一起的解决方案?

这就是我成功处理它的方式,但是您可以这样做,而无需使用公用表表达式(当然也可以是临时表)实际创建单独的数据集。

对于这些示例表:

       AGE_Table
    ID   Group     Group_Desc    Toys
    1    A         00-10        Teddy Bear
    2    B         11-20        Video Game
    3    C         21-30        Sports Car
    4    D         31-40        Mansion
    5    E         41-50        Jewelry

                 People_Table  (filtered for whatever date)
    ID    Name          Age    Gender   Age_Group
    1     Ariel         07     F        A
    2     Brandon       23     M        C
    3     Chelsea       27     F        C
    4     Derek         06     M        A

您希望看到 00-10 行的 2 个结果,21-30 行的 2 个结果,然后即使没有任何结果,仍然可以看到其他年龄组的行。

我们想创建一个包含所有不同年龄段的数据集,然后加入它。看一个使用公用表表达式的解决方案:

    with CTE_Age AS
    (SELECT Distinct Age_Group from AGE_Table)

    SELECT ID, Name, Age, Gender, CTE_Age.Age_Group FROM People_Table
    RIGHT JOIN CTE_Age ON
    People_Table.Age_Group = CTE_Age.Age_Group

这将返回:

    ID     Name        Age     Gender     Age_Group
    1      Ariel       7       F          A
    4      Derek       6       M          A
    NULL   NULL        NULL    NULL       B
    2      Brandon     23      M          C
    3      Chelsea     27      F          C
    NULL   NULL        NULL    NULL       D
    NULL   NULL        NULL    NULL       E

一旦你的数据集中有了它,你就可以在报表生成器端将 NULL 值更改为 0 ——我认为在 2008R2 中,默认值只是空白。

于 2014-07-15T23:25:45.473 回答