计算总计和其他聚合 (Reporting Services)

在 Tablix 数据区域中,可以显示报表数据集、数据区域或组的聚合总计。您可以使用**“添加总计”**命令提供的默认聚合,并使用默认作用域。或者,您也可以指定内置函数中的其他聚合函数,或者指定其他作用域。

若要自定义聚合计算,您可以将组变量与自定义代码一起使用。有关详细信息,请参阅 Using Group Variables in Reporting Services 2008 for Custom Aggregation(在 Reporting Services 2008 使用组变量自定义聚合)。

有关作用域的详细信息,请参阅 msdn.microsoft.com 上 Report Builder 3.0 文档中的了解总计、聚合和内置集合的表达式作用域 (Report Builder 3.0)

了解“添加总计”命令

若要显示 Tablix 数据区域总计和组小计,请使用快捷方式**“添加总计”命令。“添加总计”命令是与上下文相关的。对于行组区域中的单元,“添加总计”命令会在总计的组之外自动添加一行。对于列组区域中的单元,“添加总计”命令会自动在该组之外添加一个总计列。对于包含数值字段表达式的正文区中的单元,“添加总计”命令提供了是向行还是向列添加总计的选择。有关如何使用“添加总计”**命令的详细信息,请参阅如何向组或 Tablix 数据区域添加总计 (Reporting Services)

默认情况下,**“添加总计”**命令使用 Sum 函数。但是,您可以将 Sum 函数更改为其他内置函数,并对某一作用域执行不同的聚合。还可以编写您自己的表达式,以计算某一作用域相对于另一作用域的聚合值。例如,您可能希望计算某一组值相对于完整数据集的百分比。有关如何使用其他内置函数以执行聚合的详细信息,请参阅在表达式中使用内置报表函数和聚合函数 (Reporting Services)。有关内置函数的列表,请参阅在表达式中使用内置报表函数和聚合函数 (Reporting Services)

了解默认作用域

处理和呈现 Tablix 数据区域时,报表设计器会计算 Tablix 单元作用域的上下文中每个单元的值。如果某一单元位于与行组或列组关联的行中,则该单元可属于多个组。单元所属的组集、计算表达式所针对的数据区域或数据集称为“作用域”。默认的作用域是通过该单元所属的最内部的行组和列组定义的。可视提示有助于标识选定单元成员所属的组。有关详细信息,请参阅了解 Tablix 数据区域单元、行和列

对于默认作用域的示例,下图具有一个基于日期的父行组、一个基于订单的子行组和一个详细信息组。

设计视图:基本表中的总计

下图显示多个行中 Tablix 正文单元中的 Qty 和 LineTotal 的字段表达式。以下列表对每个行中上述字段表达式的默认作用域进行了说明:

  • 行 1。该行显示作为静态文本的列标签。默认作用域为数据区域。该行只重复一次,有时被称为标题行。

  • 行 2。该行显示详细信息的行控点 (详细信息行的 3 条平行线的行控点) 指示的详细信息数据。[Qty] 的默认作用域为详细信息组,它是在应用所有数据集、数据区域和组筛选器之后绑定到该数据区域的数据集中的数据。该行针对数据集查询结果集中的每个行重复一次。值 [Qty] 显示结果集中的详细信息数据。

  • 行 3。该行显示聚合值。[Sum(Qty)] 的默认作用域为子行组 Order。该行针对每个唯一订单号值重复一次。值 [Sum(Qty)] 显示每个订单号的聚合总数。

  • 行 4。该行显示聚合值。[Sum(Qty)] 的默认作用域为父行组 Date。该行针对每个唯一日期值重复一次。值 [Sum(Qty)] 显示每个日期的聚合总数。

  • 行 5。该行显示聚合值。[Sum(Qty)] 的默认作用域为数据区域。该行只重复一次,有时被称为组尾行。值 [Sum(Qty)] 显示数据区域的聚合总数。

有关上下文和作用域的详细信息,请参阅在表达式中使用内置报表函数和聚合函数 (Reporting Services)。有关解释 Tablix 数据区域中的可视提示的详细信息,请参阅了解 Tablix 数据区域单元、行和列

指定命名作用域的聚合计算

若要指定与默认作用域不同的作用域,请指定一个“命名作用域”。命名作用域包含数据集、数据区域或组的名称。由于表达式与上下文相关,指定的命名作用域必须对内置函数有效。每个内置函数都指定了哪些作用域是有效的参数。有关详细信息,请参阅在表达式中使用内置报表函数和聚合函数 (Reporting Services) 中的特定函数参考主题。

为了说明如何将默认作用域更改为命名作用域,假定一个具有以下数据结构的报表:

  • 名为 Sales 的报表数据集。

  • 名为 Tablix1 且包含以下组的表数据区域:

    • 名为 Category 且包含名为 Subcat 的子组的父行组。

    • 名为 Geography 且包含名为 CountryRegion 的子组的父列组。

针对此报表,请使用**“添加总计”**命令添加各个单元的总计。生成的此报表可能类似于下图。

带有总计的矩阵、嵌套行组和列组

在此图中,已选定其中一个单元。对于该选定单元,橙色的组指示器方括号显示最内部的组成员身份:Category 组和 CountryRegion 组。这两个最内部的组成员身份定义该单元的默认作用域。(对于选定单元,还有两个显示 Subcat 行组和 Geography 列组的灰色组方括号。使用灰色组方括号标记的组可以是选定内部组的外部组,或者不在选定单元的作用域中。)

该选定单元具有如下表达式:[Sum(LineTotal)]。根据该单元的作用域和表达式,呈现的报表将文本框的值显示为每个特定 CountryRegion 值中的每个特定 Subcat 值 [LineTotal] 总计。

您可以通过下列方式更改该单元的作用域,而无需替换表达式中的 Sum 函数:

  • 将作用域更改为 Sales 数据集。例如,若要指定数据集总计,您应将表达式更改为 =Sum(Fields!LineTotal.Value, "Sales")。

  • 将作用域更改为整个 Tablix1 数据区域。例如,若要计算某一组在总数据区域中所占的百分比,应将表达式更改为 =Sum(Fields!LineTotal.Value)/Sum((Fields! LineTotal.Value),"Tablix1")。

    在此新表达式中,分子 Sum(Fields! LineTotal.Value) 是每个类别的行总计值之和。分母 Sum((Fields! LineTotal.Value), "Tablix1") 是数据区域的行总计值之和。结果为每个类别在总数据区域中所占的百分比。

    在选定单元中,您可以为 Sum 函数指定以下组作用域之一:CountryRegion、Geography 或 Category。不能指定组作用域 Subcat,因为该单元不在与 Subcat 组关联的行中。

    备注

    也可以为聚合函数仅指定一个作用域。不能同时指定“Category”和“Geography”作为分母表达式的作用域。不支持指定多个作用域。

有关内置函数的列表,请参阅在表达式中使用内置报表函数和聚合函数 (Reporting Services)

指定不同作用域的示例

下表提供了使用默认作用域、数据区域作用域和数据集作用域的表达式示例。这些示例假定存在一个名为“Tablix1”的 Tablix 数据区域和一个名为“Sales”的数据集,该数据集具有一个包含销售订单中行项总计且名为“LineTotal”的字段。

说明

表达式

当前作用域中所有行项总计值之和。

=Sum(Field!LineTotal.Value)

(当前作用域中所有行项总计值之和)/(数据区域中所有行总计值之和)的百分比。

该值的格式是使用文本框的默认显示格式进行设置的。

=Sum(Field!LineTotal.Value)/Sum(Field!LineTotal.Value,"Tablix1")

在放置到与组 CountryRegion 关联的行中时:

(CountryRegion 组中所有行项总计值之和)/(Geography 组中所有行总计值之和)的百分比。

该值的格式是使用文本框的默认显示格式进行设置的,必须以 #.#% 格式将该值设置为 P1。

=Sum(Field!LineTotal.Value)/Sum(Field!LineTotal.Value,"Geography")

(当前作用域中所有行项总计值之和)/(数据区域中所有行总计值之和)的百分比。

该值的格式是使用 IIF 进行设置的,这样,如果当前组中没有行项总计,结果则为空白。

=IIF(Sum(Field!LineTotal.Value)<=0,"", FormatPercent(Sum(Field!LineTotal.Value)/Sum(Field!LineTotal.Value,"Tablix1"),1)

(当前作用域中所有行项总计值之和)/(数据集中所有行项总计值之和)的百分比。

该值的格式是使用指定一个小数位的 FormatPercent 进行设置的。

="Percentage contributing to all sales: " & FormatPercent(Sum(Field!LineTotal.Value)/Sum(Field!LineTotal.Value,"Sales"),1)

取消单元中的 Null 值或零值

对于大多数报表,计算的作用域为组时可以创建多个具有零 (0) 或 Null 值的单元。若要减少报表中的混乱,请添加在聚合值为 0 时返回空白的表达式。有关详细信息,请参阅 表达式示例 (Reporting Services)中的“取消 Null 或零值的示例”。

请参阅

参考

表达式示例 (Reporting Services)

概念

组表达式示例 (Reporting Services)

创建递归层次结构组 (Reporting Services)

使用 Tablix 数据区域