跳至主要内容

Power BI Calculate 教程

学习如何使用 Power BI 的 CALCULATE() 函数,并通过示例展示其用法。
· 6分钟 阅读

使用 AI 探索

CALCULATE() 函数可以说是 Power BI 中最重要(也最受欢迎)的 DAX 函数之一。它易于使用且非常灵活,能够拓展您的数据分析,并帮助您制作更有价值的 Power BI 报告。

本教程重点介绍 CALCULATE() 函数是什么以及如何使用它,并假设您已熟悉 Power BI 和 DAX 的基础知识。

什么是 Power BI 的 Calculate() 函数? 

根据 Microsoft Power BI 文档,CALCULATE() 函数属于筛选器函数类别,被定义为“在修改后的筛选上下文中评估表达式”。表达式本质上是一个度量,包含诸如 SUM()、AVERAGE() 和 COUNT() 等函数。该表达式在一个或多个筛选器的上下文中进行评估。 

您可能知道,在不使用 CALCULATE() 函数创建度量的情况下,也可以通过在 Power BI 报表中添加切片器来应用筛选器。然而,在许多用例中,CALCULATE() 函数更为合适。将其作为其他函数的组成部分尤其有用。我们将在下文的示例中看到它如何用于计算占总量的百分比。

DAX Calculate() 基本语法

CALCULATE() 函数的基本 DAX 语法 为:

CALCULATE( <expression> [, <filter1> [, <filter2> [, ...]]])

CALCULATE() 函数由两个关键组成部分构成:

  • 表达式——这是聚合部分,其构造方式与度量相同,使用 SUM()、AVERAGE()、COUNT() 等函数。

  • 筛选器——该部分允许您指定一个或多个筛选器,以控制聚合的上下文。

在 CALCULATE() 函数中可以使用 3 种类型的筛选器:

  • 布尔筛选表达式——这是一种简单的筛选,结果必须为 TRUE 或 FALSE。

  • 表筛选表达式——这是一种更复杂的筛选,结果为一张表。

  • 筛选修改函数——如 ALL 和 KEEPFILTERS 等筛选属于此类,它们为您要应用的筛选上下文提供了更精细的控制。

您可以在 CALCULATE() 函数的筛选器部分中添加多个筛选器,通过逗号分隔每个筛选器。所有筛选器会一起评估,其顺序无关紧要。 

您可以使用逻辑运算符来控制筛选器的评估方式。若希望所有条件都评估为 TRUE,可以使用 AND(&&)。这也是上述筛选器的默认行为。或者,使用 OR(||)运算符时,只要至少有一个条件评估为 TRUE,即可返回结果。

如何使用 Power BI Calculate()

要使用 CALCULATE(),只需向表中添加一个度量。您可以通过在功能区中转到建模选项卡并选择新建度量值来完成此操作。 

在 Power BI 的建模选项卡中选择新建度量值

在 Power BI 建模选项卡中选择新建度量值。图片作者自制

下面是一个使用 SUM() 求总营收并筛选 Country = United Kingdom 的 CALCULATE() 简单示例。我们将在教程末尾再次更详细地讨论该示例。

UK Revenue = CALCULATE(SUM('Online Retail'[Revenue]), 
               'Online Retail'[Country] = "United Kingdom")

在表格中查看时,我们可以看到UK Revenue 度量仅是在表格已按Month 进行筛选的上下文上,额外对 Country 应用了一个筛选。以这种方式使用 CALCULATE() 函数,可让我们对可视对象中显示的信息进行更细粒度的控制。 

Power BI 中的营收表Power BI 中的营收表。图片作者自制

在创建度量时,务必要遵循良好的数据建模实践,特别是在查询速度和优化方面。基于此,某些 CALCULATE() 的用法比其他用法更快或更合适。 

例如,Microsoft 文档建议避免将 FILTER() 函数作为其他函数(如 CALCULATE())的参数使用。相反,在可能的情况下,最好使用布尔表达式,因为它们针对这一目的进行了明确优化。

在上面的示例中,我们使用布尔表达式来定义 Country = United Kingdom 的筛选。这是一种更快、更优化的方法。另一方面,下面是一个使用 FILTER() 的示例,尽管得到相同结果,但计算更慢:

UK Revenue = CALCULATE(SUM('Online Retail'[Revenue]),
              FILTER('Online Retail',
                        'Online Retail'[Country] = "United Kingdom")

Power BI Calculate() 函数示例

借助一个真实的电商数据集,我们将探讨 CALCULATE() 函数用于解决业务问题的几种关键方式。要跟随本教程,您可以访问托管在 DataLab 上的电商数据集。

该数据集包含客户每次购买的信息:购买国家、产品描述、购买的日期和时间,以及每种产品的数量和价格。

我们将借助 CALCULATE() 函数回答以下问题:

  • 英国的月度总营收与其他国家相比如何?
  • 总营收中来自英国的占比是多少?
  • 按日累计营收是多少?

英国的月度总营收与其他国家相比如何?

为回答此问题,我们需要使用 CALCULATE() 函数创建两个度量。首先,使用一个简单的布尔筛选,创建在英国范围内返回总营收(使用 SUM() 函数)的度量:

UK Revenue = CALCULATE(SUM('Online Retail'[Revenue]),
              'Online Retail'[Country] = "United Kingdom")

接着,我们创建一个类似的度量,但这次使用 FILTER() 函数。该筛选表达式遍历 Country 列的每一行,并返回包含匹配筛选条件行的表。在此处需要使用 FILTER() 函数,是因为无法从筛选中返回一个简单的 TRUE 或 FALSE;相反,我们会得到一个包含多个值的表。

Non-UK Revenue = CALCULATE(SUM('Online Retail'[Revenue]),
                    FILTER('Online Retail',
                        'Online Retail'[Country] <>"United Kingdom")

因此,我们可以看到,与其他所有国家相比,英国为这家电商商店贡献了大部分营收。

Power BI 折线图显示按年和月的营收Power BI 折线图显示月度营收。图片作者自制。 

总营收中来自英国的占比是多少?

这是 Power BI 开发者和用户经常面临的一类问题,也是应用 CALCULATE() 函数的完美场景。

要计算占总量的百分比,我们首先需要能够在不受报表中其他筛选上下文影响的情况下返回总量。为此,我们使用一种称为 ALL() 的筛选修改函数。通过该函数,我们可以指定计算应完全忽略哪些列上的任何筛选。 

在本例中,我们要计算英国的总营收占比。这意味着计算应忽略对 Country 列的任何筛选。

Total Revenue = CALCULATE(SUM('Online Retail'[Revenue]),
                  ALL('Online Retail'[Country]))

这很重要,因为 CALCULATE() 可能在一个已对 Product[Color] 进行筛选的筛选上下文中执行。在这种情况下,存在 ALL 意味着外层对 Product[Color] 的筛选被忽略,并由 CALCULATE() 引入的新筛选所取代。如果我们在矩阵中不是按 Brand 切片,而是按 Color 切片,这一点就很明显。

既然我们已得到总营收,就可以构建一个度量来显示总营收的百分比。不过,由于我们特别关注英国,因此我们会再次使用 CALCULATE() 函数,但这次采用一个简单的布尔筛选。

UK % of Revenue = CALCULATE(SUM('Online Retail'[Revenue])/[Total Revenue],
                    'Online Retail'[Country] = "United Kingdom")

现在我们可以看到,英国占这家电商商店总营收的 84%。

在 Power BI 中计算百分比在 Power BI 中计算百分比。图片作者自制

按日累计营收是多少?

累计营收能够为营收趋势提供一些洞见。将该累计营收绘制成图表,我们还可以直观地看到营收随时间是否以更快的速度增长。

为回答这一问题,我们需要创建一个结合 CALCULATE() 函数以及以下筛选函数的度量:ALLSELECTED()、FILTER(),并结合 MAX() 函数进行评估。

Cumulative Revenue = CALCULATE(SUM('Online Retail'[Revenue]),
                FILTER( ALLSELECTED('Online Retail'[InvoiceDate]),
                'Online Retail'[InvoiceDate] <= MAX('Online Retail'[InvoiceDate])))

我们来看看这里这些筛选为何重要:

  • FILTER() 函数允许我们指定的两个筛选逐行评估,并在匹配的情况下返回一张表。

  • ALLSELECTED() 函数会在当前查询中(下方结果中的当前查询为折线图)重置对 InvoiceDate 的筛选,同时仍允许来自切片器等外部筛选。

  • MAX() 函数用于评估的一部分——我们希望对当前查询中小于或等于当前日期的所有日期的营收求和。

在 Power BI 中按日期计算营收在 Power BI 中按日期计算营收。图片作者自制。 

结语

在本教程中,我们讨论了 Power BI 中的 CALCULATE() 函数及其用法。我们还将 CALCULATE() 应用于一个真实的电商数据集,并用它回答了一些关键业务问题。

CALCULATE() 是 Power BI 中最有用的函数之一,在构建报告并深入洞察数据时,您很可能会频繁使用它。 

希望本教程不仅帮助您理解 CALCULATE() 的基本语法,还能帮助您了解它作为一名Power BI 数据分析师解决实际业务问题时的应用。 

主题