当SSRS中的数据不存在时,使用“0”填充

时间:2013-06-27 11:49:50

标签: reporting-services

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

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

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

2 个答案:

答案 0 :(得分:3)

我可以想到几种方法:

数据集级别

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

e.g。对于数据库查询,它可能是innerleft 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为每个年龄组显示一行,然后在显示该行所需数据的每一行中嵌入一个子报告。

这使您可以灵活地进行布局,但这会增加报表的复杂性,并且意味着您可以通过其他选项进行大量的DataSet调用。

答案 1 :(得分: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中,默认值只是空白。