Reporting services 当SSR中的数据不存在时填充“0”

Reporting services 当SSR中的数据不存在时填充“0”,reporting-services,Reporting Services,我试图在SSRS中创建一个报告,其中有一个矩阵,列标题是性别,行是专门定义的年龄组。报告按日期排序,即显示的记录按modifedAt值过滤。我的问题是,我希望显示所有年龄组类别,即使数据集没有返回该行的任何数据 因此,例如,如果我将日期设置为没有db行且其中有Age5-16子项的日期-我仍然希望显示类别名称,但只希望与该行相关的单元格显示“0”。相反,报告只是删除整行,因为查询显然不返回任何数据 解决方案是使用一个单独的数据集返回整个类别列表,然后以某种方式将它们组合在一起吗?我被困在这里,所以

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

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


解决方案是使用一个单独的数据集返回整个类别列表,然后以某种方式将它们组合在一起吗?我被困在这里,所以任何帮助都是感激的

我可以想出一些方法来做到这一点:

数据集级别

不只是返回数据集中基础数据中的相关数据,而是包括所有情况下要显示的所有类别

e、 例如,对于数据库查询,它可能是内部联接和左联接之间的差异,例如,从以下内容开始:

select *
from AgeGroup
  inner join MyData on ...
致:

因此,报告始终显示所有年龄组。如果有空值,只显示0

我认为如果您可以控制数据集,那么这是最好的选择-您根本不必更新报告,幸运的是,实际的数据集更改应该是最小的,仍然只有一个数据集调用,而且它是迄今为止最容易维护的

将组硬编码到报告中

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

在这里,您可以使用某种条件表达式来显示值,例如,对于每个组行,它将根据该组进行定制:

=Sum(IIf(Fields!AgeGroup.Value = "5-16", Fields!Amount.Value, Nothing)
这不是太灵活,在您更改组时需要更新,并且没有太多的布局选项。仍然只有一个数据集调用,因此这是一个加号

子报告

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


这允许您在布局上具有灵活性,但会增加报告的复杂性,这意味着您需要进行大量数据集调用,而这些调用可以通过其他选项避免。

我可以想出几种方法来实现这一点:

数据集级别

不只是返回数据集中基础数据中的相关数据,而是包括所有情况下要显示的所有类别

e、 例如,对于数据库查询,它可能是内部联接和左联接之间的差异,例如,从以下内容开始:

select *
from AgeGroup
  inner join MyData on ...
致:

因此,报告始终显示所有年龄组。如果有空值,只显示0

我认为如果您可以控制数据集,那么这是最好的选择-您根本不必更新报告,幸运的是,实际的数据集更改应该是最小的,仍然只有一个数据集调用,而且它是迄今为止最容易维护的

将组硬编码到报告中

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

在这里,您可以使用某种条件表达式来显示值,例如,对于每个组行,它将根据该组进行定制:

=Sum(IIf(Fields!AgeGroup.Value = "5-16", Fields!Amount.Value, Nothing)
这不是太灵活,在您更改组时需要更新,并且没有太多的布局选项。仍然只有一个数据集调用,因此这是一个加号

子报告

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


这允许您在布局上具有灵活性,但会增加报告的复杂性,这意味着您需要进行大量的数据集调用,而这些调用可以通过其他选项避免。

我知道这很旧,但我想在数据集级别详细介绍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行的两个结果,21-30行的两个结果,然后仍然可以看到其他年龄组的行,即使没有任何结果

我们希望创建一个包含所有不同年龄组的数据集,然后加入其中。请看一个使用通用表表达式的解决方案:

    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
一旦数据集中有了空值,就可以在报表生成器端将空值更改为0-I thi
nk在2008R2中,默认值是空的。

我知道这是旧的,但我想详细介绍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行的两个结果,21-30行的两个结果,然后仍然可以看到其他年龄组的行,即使没有任何结果

我们希望创建一个包含所有不同年龄组的数据集,然后加入其中。请看一个使用通用表表达式的解决方案:

    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中,默认值只是空白