公式中的聚合
本主题介绍聚合,并概述可用于 PowerPivot for Excel 的聚合类型。PowerPivot for Excel 包含两种可用于生成聚合的以下工具:
您可以生成基于 PowerPivot 数据的数据透视表和数据透视图。 Excel 数据透视表是对工作表中的数据进行分组和汇总的常用工具。 PowerPivot 已与 Excel 中的数据透视表功能集成,并进行了很多改进。
您可以使用 DAX 公式语言来设计自定义聚合。 DAX 可用于在 PowerPivot 表中创建“计算列”,以及在数据透视表和数据透视图中创建“度量值”。
本主题的最后部分提供了一些链接,这些链接提供如何生成聚合的详细信息。
聚合简介
“聚合”是一种对数据进行折叠、汇总或分组的方法。 在您开始使用表中或其他数据源中的原始数据时,数据通常是平面的,这意味着尽管有很多细节,但未通过任何方式进行组织或分组。 由于在汇总或结构上的这一不足,可能导致从数据中发现有意义的模式比较困难。 因此,分析人员的一项重要工作就是定义聚合,这些聚合为解决特定的业务问题而对模式进行简化、提取或汇总。
为聚合选择组
聚合数据时,按产品、价格、区域或日期等属性对数据分组,然后定义用于组中所有数据的公式。 例如,创建年的总计时,就是在创建一个聚合。 如果您创建今年对去年的比例并以百分比形式显示,这就是另一种聚合方式。
如何对数据分组取决于业务问题。 例如,聚合可以回答以下问题:
计数:一个月发生了多少笔交易?
平均值:本月每个销售人员的平均销售额是多少?
最小和最大值:销售量列前 5 位的是哪些地区?
若要创建回答这些问题的计算,您必须具有包含要计数或求和的数字的详细数据,并且这些数字数据必须以某种方式与您要用于组织结果的组相关。
如果数据尚未包含您可以用于分组的值,例如不包含产品类别或店铺所在的地理区域的名称,您最好通过添加类别来引入针对您的数据的组。 当您在 Excel 中构建组时,必须手动键入要使用的组,或从工作表的列中选择要使用的组。
但在关系系统中,诸如产品的类别等层次结构通常存储在不同于事实表或值表的表中。 通常将通过某种键将类别表链接到事实数据。 例如,假设您发现您的数据包含产品 ID 但是不包含产品名称或类别。 若要向平面 Excel 工作表添加类别,您可能需要在包含类别名称的列中复制。 但在 PowerPivot 工作簿中,您可以将产品类别表导入到您的工作簿中,在具有编号数据的表和产品类别列表之间创建关系,然后使用类别对数据进行分组。 有关详细信息,请参阅表之间的关系。
为聚合选择函数
确定并添加了要使用的分组后,必须确定要用于聚合的数学函数。 聚合一词通常用作在聚合中使用的数学或统计运算(如总和、平均值、最小值或计数)的同义词。 但是,PowerPivot for Excel 除了允许您使用在 Excel 中提供的标准聚合外,还允许创建自定义公式以便用于聚合。
例如,对于在前面的示例中使用的同一组值和分组,您可以创建回答以下问题的自定义聚合:
筛选的计数:一个月发生了多少笔交易(月末维护窗口期除外)?
使用某时段内平均值的比例:与去年同期相比,销售额增长百分比或下降百分比是多少?
分组的最小和最大值:对于每个产品类别或对于每种促销方式哪些地区的销售额名列前茅?
将聚合添加到公式和数据透视表
在您大致确定如何对数据进行分组才有意义以及要使用的值后,可以决定是生成数据透视表还是在表中创建计算。 PowerPivot for Excel 扩展并改进了 Excel 的固有功能,以便创建求和、计数或求平均值之类的聚合。 您可以在 PowerPivot 的 PowerPivot 窗口或 Excel 数据透视表区域中创建自定义聚合。
在计算列中,您可以创建考虑到当前行上下文的聚合,以便从另一个表中检索相关行,然后对相关行中的这些值进行求和、计数或求平均值运算。
在度量值中,您可以创建动态聚合,这些聚合使用公式中定义的筛选器和数据透视表的设计施加的筛选器,以及所选的切片器、列标题和行标题。
有关详细信息,请参阅生成计算的公式。
将分组添加到数据透视表
当您设计数据透视表时,可以将代表分组、类别或层次结构的字段拖到数据透视表的列和行部分,以便对数据进行分组。 然后将包含数值的字段拖到值区域中,以便可以对它们进行计数、求平均值或求和。
如果将类别添加到数据透视表但是类别数据与事实数据无关,可能会得到错误或奇怪的结果。 通常 PowerPivot for Excel 将通过自动检测和提出关系建议来尝试解决问题。 有关详细信息,请参阅在数据透视表中使用关系。
还可以将字段拖到切片器中,从而选择要查看的某些数据组。 切片器是 Excel 和 PowerPivot for Excel 中的一种新功能,允许您以交互方式对数据透视表中的结果进行分组、排序和筛选。
在公式中使用分组
还可以通过创建各表之间的关系,然后创建利用这些关系来查找相关值的公式,使用分组和类别对存储在表中的数据进行聚合。
换言之,如果您想要创建按类别对值进行分组的公式,则应首先使用关系来连接包含详细数据的表和包含类别的表,然后生成公式。
有关如何生成使用查找的公式的详细信息,请参阅公式中的关系和查找。
在聚合中使用筛选器
PowerPivot 中的一种新功能可以将筛选器应用到数据的列和表,这不仅针对用户界面和数据透视表或数据透视图中的数据,而且针对要用于计算聚合的特定公式。 可以在计算列和度量值的公式中使用筛选器。
例如,在新的 DAX 聚合函数中,不需要指定要求和或计数的值,可以将整个表作为参数指定。 如果没有将任何筛选器应用到该表,则聚合函数适用于该表的指定列中的所有值。 但是,在 DAX 中,您可以为表创建动态或静态筛选器,以便根据筛选条件和当前上下文针对不同的数据子集应用聚合运算。
通过组合公式中的条件和筛选器,您可以创建随公式中提供的值变化的聚合,或创建随数据透视表中选择的行标题和列标题变化的聚合。
有关详细信息,请参阅筛选公式中的数据。
Excel 聚合函数和 DAX 聚合函数的比较
下表列出了 Excel 提供的一些标准聚合函数,并提供指向 PowerPivot for Excel 中这些函数的实现的链接。 这些函数的 DAX 版本在行为上与 Excel 版本十分相似,只是在语法以及对某些数据类型的处理上有一些细微差别。
标准聚合函数
函数 |
请使用 |
返回列中所有数字的平均值(算术平均值)。 |
|
返回列中所有值的平均值(算术平均值)。 处理文本和非数字值。 |
|
对列中的数值进行计数。 |
|
计算列中不为空的值的数目。 |
|
返回列中的最大数值。 |
|
返回对某个表执行计算的一组表达式中的最大值。 |
|
返回列中的最小数值。 |
|
返回对某个表执行计算的一组表达式中的最小值。 |
|
对列中的所有数字求和。 |
DAX 聚合函数
DAX 提供一些聚合函数,这些函数允许您指定要对其执行聚合的表。 因此,代替只对列中的值求和或求平均值,这些函数可用于创建动态定义要聚合的数据的表达式。
下表列出了 DAX 中可用的聚合函数:
函数 |
用法 |
计算对表进行求值的一组表达式的平均值。 |
|
计算对表进行求值的一组表达式的数目。 |
|
计算列中空白值的数目。 |
|
计算表中行的总数。 |
|
计算从嵌套的表函数(例如筛选器函数)返回的行的数目。 |
|
返回对表进行计算的一组表达式之和。 |
DAX 聚合函数和 Excel 聚合函数之间的差异
这些函数的名称与相应的 Excel 函数相同,但它们使用 PowerPivot VertiPaq 引擎并且经过重新编写以便使用表和列。不能在 Excel 工作簿中使用 DAX 公式,反之亦然。 它们只能用于 PowerPivot 窗口和基于 PowerPivot 数据的数据透视表中。 此外,虽然这些函数具有相同的名称,但行为可能稍有不同。 有关详细信息,请参阅相应的函数参考主题。
在聚合中计算列的方式与 Excel 处理聚合的方式也有所不同。 下面将以一个例子来帮助阐明这个不同。
假设您希望获得 Sales 表的 Amount 列中各值的总和,因此创建以下公式:
=SUM('Sales'[Amount])
在最简单的情况下,该函数从单个未筛选列中获取值,并且结果与在 Excel 中时相同,只是对 Amount 列中的各值始终只进行加总。 然而,在 PowerPivot 中,对该公式的解释为:“获取 Sales 表中每行的 Amount 值,然后合计这些单独的值。” PowerPivot 会对执行聚合运算的每一行进行求值,并为每一行计算一个标量值,然后对这些值执行聚合运算。 因此,如果筛选器已应用于某个表,或者如果基于可能已筛选的其他聚合对值进行计算,公式的结果可能会不同。 有关详细信息,请参阅DAX 公式中的上下文。
DAX 时间智能函数
除了上一节所述的新的表聚合函数之外,DAX 还提供使用您指定的日期和时间的聚合函数,从而提供内置“时间智能”。 这些函数使用日期范围来获取相关的值并对值进行聚合。 还可以比较各个日期范围中的值。
下表列出了可以用于聚合的时间智能函数:
函数 |
用法 |
计算处于给定期间的日历末尾的值。 |
|
计算处于给定期间前的期间的日历末尾的值。 |
|
针对以期间的第一天开始到以指定日期列中的最晚日期结束的间隔,计算某个值。 |
时间智能函数部分(时间智能函数 (DAX))中的其他函数是可用于检索要在聚合中使用的日期或自定义日期范围的函数。 例如,您可以使用 DATESINPERIOD 函数来返回某一范围的日期,并且使用该日期集作为其他函数的参数,以便只计算那些日期的自定义聚合。