Power BI 微课堂 | 第25课:DAX 基础知识

published: 2024-02-22

今天,我们开始学习:DAX 基础知识,了解数据分析表达式 (DAX)的一些基础概念与重要性,以及如何快速简单地使用,以便解决许多基本计算和数据分析问题。


》DAX 是什么?

DAX 是公式或表达式中可用于计算并返回一个或多个值的函数、运算符或常量的集合。借助 DAX,你可以通过模型中已有的数据来创建新信息。

为什么 DAX 很重要?虽然你无需使用任何 DAX 公式,就可轻松创建新的 Power BI Desktop 文件并导入一些数据,甚至是创建显示宝贵见解的报表。但是,如果你需要分析跨产品类别和不同日期范围内的增长百分比, 或者要计算相对于市场趋势的同比增长,该怎么办?

面对这类分析需求,DAX 公式提供了解决方案。因此,了解如何创建有效的 DAX 公式可帮助你充分利用数据。当获取所需信息后,便可开始解决影响最终赢利的实际商业问题。


》开始探索 DAX

熟悉如何在 Microsoft Excel 中创建公式的用户,能够更快理解 DAX。但即使你没有使用 Excel 公式的经验,本期微课堂也将帮助你开始创建 DAX 公式并即刻解决实际 BI 问题。

接下来,我们将重点介绍计算中所用的 DAX 公式。更确切地说,也就是度量值和计算列中所用的 DAX 公式。关于度量值和计算列的基本概念,你可以翻阅往期微课堂。

本期微课堂使用的是 Power BI Desktop 的 Contoso 销售示例文件(页面右侧附下载按钮),并围绕语法、函数和上下文这三个基本概念来介绍 DAX。虽然还有其他重要概念,但提前了解这三个概念将为你学习 DAX 技能奠定最佳基础。


01 DAX 语法

创建你自己的公式之前,我们来看看 DAX 公式语法。语法包括组成公式的各种元素,简单来说就是公式的编写方式。例如,以下是某个度量值的简单 DAX 公式:

如上图所示,此公式包含以下语法元素:

  • A. 度量值名称 Total Sales

  • B. 等号运算符 ( = ) 表示公式的开头。完成计算后将会返回结果

  • C. DAX 函数 SUM 会将 Sales[SalesAmount] 列中的所有数字相加

  • D. 括号 () 会括住包含一个或多个参数的表达式。大多数函数都至少需要一个参数。一个参数会传递一个值给函数

  • E. 引用的表 Sales

  • F. Sales 表中的引用列 [SalesAmount]。使用此参数,SUM 函数就知道在哪一列上聚合求和

当你在尝试了解 DAX 公式时,将每个元素分解成平日思考及说出的话语会很有帮助。例如,你可将此公式读成:针对名为 Total Sales 的度量值,计算 (=) Sales 表中的 [SalesAmount ] 列中的值总和。

将其添加到报表视图后,此度量值会将所包含的其他字段的销售额(例如美国的手机)相加,进行计算并返回值。

这时,你可能会想:这个度量值的功能不是与直接将 SalesAmount 字段添加到报表中一样吗?没错。但是,创建度量值来对 SalesAmount 字段中的值求和有个好处:我们可以将它当作参数用于其他公式。这个解决方案目前可能有点难以理解,但随着你对 DAX 公式的熟悉,了解此度量值可让你的公式和模型更有效率。事实上,稍后你将看到 Total Sales 度量值如何显示为其他公式中的参数。

下面,我们将着重介绍 SUM 函数。

函数是预编写的公式,能够简化复杂计算和对数字、日期、时间、文本等内容的操作。稍后你将了解有关函数的详细信息。你还会看到 [SalesAmount] 列前面加上了列所属的 Sales 表。这就是所谓的完全限定列名称,因为它包括列名称且前面加上了表名。同一个表中引用的列不需要在公式中包含表名,这可以使引用多个列的长公式更短且更易于阅读。但是,最好能够在你的度量值公式中包含表名,即使在同一表中亦然。

需要说明的是:如果表名包含空格、保留的关键字或不允许的字符,则必须用单引号引住该表名。如果该名称包含 ANSI 字母数字字符范围以外的任何字符,则不论你的区域设置是否支持字符集,均需用引号引住表名。

公式语法的正确性非常重要。大多数情况下,如果语法不正确,将返回语法错误。其他情况下,语法可能正确,但返回的值可能不是预期值。Power BI Desktop 中的 DAX 编辑器包括了建议功能,这项功能通过帮助你选择正确的元素来创建语法正确的公式。

实践出真知,让我们创建一个度量值公式,这将帮助你进一步了解公式语法以及编辑栏中的建议功能可以起到怎样的作用。

  • 首先,下载并打开 Contoso 销售示例 Power BI Desktop 文件。在“报表”视图的字段列表中,右键单击 Sales 表,然后选择“新建度量值”。

  • 然后,在编辑栏中通过键入新的度量值名称 Previous Quarter Sales 来替换“度量值”。在等号后键入字母 CAL,然后双击要使用的函数。在此示例中,需要使用 CALCULATE 函数。PS:你需通过传递给 CALCULATE 函数的参数,使用 CALCULATE 函数来筛选要求和的金额。这种类型的函数称为嵌套函数。CALCULATE 函数至少有两个参数。第一个参数是要计算的表达式,第二个参数是筛选器。

  • 在 CALCULATE 函数的左括号 ( 之后,键入 SUM,随后是另一个左括号 ( ,现在我们将参数传递给 SUM 函数。开始键入 Sal,然后选择 Sales[SalesAmount],后跟右括号 )。PS:此步用于创建 CALCULATE 函数的第一个表达式参数。

  • 在空格后键入逗号 (,) 以指定第一个筛选器,然后键入 PREVIOUSQUARTER。你将使用 PREVIOUSQUARTER 时间智能函数按上一季度来筛选 SUM 结果。

  • 在 PREVIOUSQUARTER 函数的括号 ( 之后,键入 Calendar[DateKey]。PS:PREVIOUSQUARTER 函数有一个参数,即包含连续日期范围的列。在本例中,这是日历表中的 DateKey 列。

  • 通过键入两个两个右括号 )) ,关闭要传递给 PREVIOUSQUARTER 和 CALCULATE 函数的两个自变量。

如图所示,完整的公式是:Previous Quarter Sales =CALCULATE(SUM(Sales[SalesAmount]), PREVIOUSQUARTER(Calendar[DateKey]))

选择公式栏中的复选标记 ✔️ 或按 Enter 键,验证公式并将它添加到 Sales 表中。你成功了!你刚才使用 DAX 创建了一个复杂的度量值。

这个公式将根据报表中应用的筛选器来计算上一季度的总销售额。例如,将 SalesAmount 和 Sales 表中新的“Previous Quarter Sales”度量值放入簇状柱形图中。然后从 Calendar 表中添加 Year 作为切片器,并选择“2011”。再添加 QuarterOfYear 作为另一个切片器并选择 4,将得到如下所示的图表:

需要说明的是:示例模型仅包含从 2011 年 1 月 1 日到 2013 年 1 月 19 日的少量销售数据。如果你选择的年份或季度无法汇总 SalesAmount,或者新度量无法计算当前或上一季度的销售数据,则不会显示该期间的数据。例如,如果你为 Year 选择 2011,为 QuarterOfYear 选择 1,则不会显示 Previous Quarter Sales 数据,因为没有 2010 年第 4 季度的数据。

此外,你还需要了解 DAX 公式的几个重要方面:此公式包括两个函数。PREVIOUSQUARTER 时间智能函数被嵌套为参数传递给 CALCULATE 筛选器函数。DAX 可以包含多达 64 个嵌套函数。一个公式不大可能会包含这么多嵌套函数。实际上,创建和调试这样的公式会很困难,而且也不会太快。在此公式中,你同样使用了筛选器。筛选器会缩小要进行计算的范围。在本例中,你选择了一个筛选器作为参数,它实际上是另一个函数的结果。稍后你将了解有关筛选器的详细信息。

你使用了 CALCULATE 函数。它是 DAX 中功能最强大的函数之一。当你创作模型并创建更复杂的公式时,可能会多次用到。

虽然有关 CALCULATE 函数的进一步讨论不在本文的讨论范围内,但是随着你对 DAX 了解的深入,请重视这个函数。


02 DAX 函数

函数是通过使用特定值、调用参数,并按特定顺序或结构来执行计算的预定义公式。参数可以是其他函数、另一个公式、表达式、列引用、数字、文本、逻辑值(如 TRUE 或 FALSE)或者常量。

DAX 包括以下函数类别:日期和时间函数、时间智能函数、信息函数、逻辑函数、数学函数、统计函数、文本函数、父/子函数和其他函数。如果你熟悉 Excel 公式中的函数,那么 DAX 中的很多函数都会让你觉得相似;但是,DAX 函数在以下方面是独一无二的:

  • DAX 函数始终引用完整的列或表。如果你想要仅使用表或列中的特定值,则可以向公式中添加筛选器。

  • 如果需要逐行自定义计算,DAX 提供了可让你将当前行值或相关值用作一种参数的函数,以便基于上下文来执行计算。稍后你将了解有关上下文的详细信息。

  • DAX 包括许多会返回表而非值的函数。表不会显示出来,但可以将其用于提供其他函数的输入。例如,你可以检索一个表,然后对该表中的非重复值进行计数,或者计算多个已筛选表或列的动态总和。

  • DAX 包括各种时间智能函数。这些函数可让你定义或选择日期范围,并基于此范围执行动态计算。例如,你可以比较并行时段内的总和。

  • Excel 有一个热门函数 VLOOKUP。不同于 Excel 中的 VLOOKUP,DAX 函数不会采用单元格或单元格区域作为引用。DAX 函数采用某一列或表作为引用。请记住,在 Power BI Desktop 中,将使用关系数据模型。查找另一个表中的值其实很简单,而且在大多数情况下,完全不需要创建任何公式。

如你所见,DAX 中的函数可帮助你创建功能非常强大的公式。我们只接触到了函数的基本概念。随着你对 DAX 技能的熟悉,你将使用许多不同的函数来创建公式。


03 DAX 上下文

上下文是我们需要了解的重要 DAX 概念之一。在 DAX 中,有两种上下文类型:行上下文和筛选上下文。

  • 行上下文:将行上下文想象成当前行是最简单的做法。每当公式中含有应用了筛选器以识别表中某一行的函数时,都可应用此方法。函数会应用所筛选的表中每行的固有行上下文。这种类型的行上下文最常应用于度量值中。

  • 筛选器上下文:筛选上下文比行上下文稍微更难理解。最简单的做法就是将筛选上下文想象成:决定结果或值的计算中所应用的一个或多个筛选器。筛选上下文并非原本就存在于行上下文中;而是另外应用到行上下文。例如,若要进一步缩小要包括在计算中的值,可以应用筛选上下文,该筛选上下文不仅要指定行上下文,还要指定该行上下文中的特定值(筛选)。可以在报表中轻松看到筛选上下文。例如,当你将 TotalCost 添加到可视化效果,然后添加 Year 和 Region 时,你就在定义基于给定年份和区域来选择数据子集的筛选上下文。

为什么筛选上下文对 DAX 很重要?你已看到,可以通过向可视化效果添加字段来应用筛选器上下文。还可以通过使用 ALL、RELATED、FILTER、CALCULATE 等函数,按照关系、其他度量值和列来定义筛选器,从而实现在 DAX 公式中应用筛选器上下文。

例如,我们来看看名为 Store Sales 的度量值中的以下公式:

为了更好地理解本公式,我们可像处理其他公式一样进行分解。此公式包含以下语法元素:

  • A. 度量值名称 Store Sales。

  • B. 等号运算符 ( = ) 表示公式的开头。

  • C. CALCULATE 函数会在根据指定筛选器所修改的上下文中,作为参数来计算表达式。

  • D. 括号 () 会括住包含一个或多个参数的表达式。

  • E. 同一表中作为表达式的 [Total Sales] 度量值。Total Sales 度量值的公式为:=SUM(Sales[SalesAmount])。

  • F. 逗号 (,) 会分隔第一个表达式参数和筛选参数。

  • G. 完全限定的引用列为 Channel[ChannelName]。这是行上下文,此列中的每行各指定一个通道,例如 Store 或 Online。

  • H. 将特定值 Store 作为筛选器。这是我们的筛选上下文。

可见,此公式可确保仅针对将“Store”值用作筛选器的 Channel[ChannelName] 列中的行,计算 Total Sales 度量值所定义的销售额值。

如你所想,能够在公式内定义筛选上下文是多么巨大且强大的功能。能够仅引用相关表中的特定值不过是其中一例,如果你还没有完全理解上下文,也无需担心。当创建自己的公式时,你将可以更好地理解上下文及其在 DAX 中非常重要的原因。


》结语

现在,你对 DAX 中最重要的概念有了基本的认识,可以开始独立创建度量值的 DAX 公式。

DAX 确实有点难以理解,但有许多资源可供你使用。相信看完本期微课堂并初步实践后,我们可以进一步了解可帮助解决业务问题的 DAX 概念和公式。

同时,也有许多 DAX 资源可供你使用,其中最实用的就是数据分析表达式(DAX)参考



以上就是关于「 DAX 基础知识」的全部内容。感谢您的耐心阅读,更多 Power BI 学习资源,请持续关注优阅达大数据生态。