了解 Power BI Desktop 中的 DAX 基础知识

不熟悉 Power BI Desktop 的用户可以使用本文快速轻松地介绍如何使用数据分析表达式(DAX)来解决许多基本计算和数据分析问题。 我们将介绍一些概念信息、你可以完成的一系列任务,以及一个知识检查来测试你学到的内容。 完成本文后,你应该充分了解 DAX 中最重要的基本概念。

什么是 DAX?

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

为什么 DAX 如此重要?

可以轻松创建新的 Power BI Desktop 文件并将一些数据导入其中。 甚至可以创建报表来显示有价值的见解,而无需使用任何 DAX 公式。 但是,如果需要分析产品类别和不同日期范围的增长百分比,该怎么办? 您需要计算同比增长率并与市场趋势进行比较吗? DAX 公式也提供此功能和其他许多重要功能。 了解如何创建有效的 DAX 公式将帮助你充分利用数据。 获取所需的信息时,可以开始解决影响底线的实际业务问题。

先决条件

你可能已经熟悉在 Microsoft Excel 中创建公式,并且该知识有助于了解 DAX。 但是,即使你没有 Excel 公式的经验,此处介绍的概念也可以帮助你开始创建 DAX 公式并立即解决实际 BI 问题。

我们将重点了解用于计算的 DAX 公式,具体来说,就是在度量和计算列中使用的公式。 你应该已经熟悉使用 Power BI Desktop 导入数据和向报表添加字段,并且还应熟悉 “度量值 ”和 “计算”列的基本概念。

示例工作簿

学习 DAX 的最佳方式是创建一些基本公式,将它们与实际数据一起使用,并自行查看结果。 此处的示例和任务使用 适用于 Power BI Desktop 文件的 Contoso 销售示例。 此示例文件与本教程中使用的文件相同 :在 Power BI Desktop 文章中创建自己的度量值

让我们开始

我们将围绕三个基本概念来定义对 DAX 的理解: 语法函数上下文。 DAX 中还有其他重要概念,但了解这三个概念将提供构建 DAX 技能的最佳基础。

Syntax

在创建自己的公式之前,让我们看看 DAX 公式语法。 语法包括构成公式的各种元素,或者更简单地说,如何编写公式。 例如,下面是度量值的简单 DAX 公式:

DAX 公式的屏幕截图,其中包含指向单个语法元素的指针。

此公式包含以下语法元素:

答: 度量值名称“ 总销售额”。

B. 等号运算符 (=),指示公式的开头。 计算后,它将返回结果。

C. DAX 函数 SUM,它加起来 Sales[SalesAmount] 列中的所有数字。 稍后将了解有关函数的详细信息。

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

E. 引用的表 Sales

F. Sales 表中引用的列 [SalesAmount]。 借助这个参数,SUM 函数能够确定在哪一列进行求和。

尝试理解 DAX 公式时,通常有助于将每个元素分解成你每天思考和说话的语言。 例如,可以读取以下公式:

对于名为 Total Sales 的度量值,计算 Sales 表中 [SalesAmount ] 列中的值的总和。

添加到报表时,此度量值通过汇总我们包括的每个字段(例如美国手机)的销售金额来计算和返回值。

你可能会想:“这个度量值的作用是否与直接将 SalesAmount 字段添加到我的报表中一样?”是的。 但是,有充分的理由创建自己的度量值,用于汇总 SalesAmount 字段中的值:我们可以将其用作其他公式中的参数。 现在,此解决方案似乎有点令人困惑,但随着 DAX 公式技能的增长,知道此度量值会使公式和模型更高效。 事实上,您稍后会看到“总销售额”度量值作为参数显示在其他公式中。

我们来了解一下此公式的更多内容。 具体而言,我们引入了函数 SUM。 函数是预先编写的公式,可更轻松地使用数字、日期、时间、文本等执行复杂的计算和操作。 稍后将了解有关函数的详细信息。

此外,还可以看到列名 [SalesAmount] 前面是列所属的 Sales 表。 此名称称为完全限定的列名,因为它包含以表名开头的列名。 在同一表中引用的列不需要将表名包含在公式中,这使得引用许多列的长公式更短、更易于阅读。 但是,最好将表名包含在度量值公式中,即使在同一表中也是如此。

注释

如果表名包含空格、保留关键字或不允许的字符,则必须将表名括在单引号中。 如果名称包含 ANSI 字母数字字符范围之外的任何字符,则还需要将表名括在引号中,而不考虑区域设置是否支持字符集。

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

让我们创建一个示例公式。 此任务将帮助你进一步了解公式语法以及公式栏中的建议功能如何帮助你。

任务:创建度量值公式

  1. 下载 并打开 Contoso 销售示例 Power BI Desktop 文件。

  2. 在“报表”视图中的字段列表中,右键单击 “销售 ”表,然后选择“ 新建度量值”。

  3. 在公式栏中,通过输入新的度量值名称“上一季度销售额”替换度量

  4. 在等号后,键入前几个字母 CAL,然后双击要使用的函数。 在此公式中,你想要使用 CALCULATE 函数。

    你将使用 CALCULATE 函数,通过传递给该函数的参数来筛选我们想要求和的金额。 这种类型的函数称为嵌套函数。 CALCULATE 函数至少有两个参数。 第一个是要计算的表达式,第二个是筛选器。

  5. 打开括号 后,对于 CALCULATE 函数,键入 SUM,然后再输入另一个左括号 )。

    接下来,我们将参数传递给 SUM 函数。

  6. 开始输入 Sal,然后选择 Sales[SalesAmount],然后输入一个右括号 )

    此步骤为 CALCULATE 函数创建第一个表达式参数。

  7. 键入逗号(,)后跟一个空格,以指定第一个筛选器,然后键入PREVIOUSQUARTER

    你将使用 PREVIOUSQUARTER 时间智能函数来按上一季度筛选 SUM 结果。

  8. 在为 PREVIOUSQUARTER 函数输入参数时,输入左括号 后,键入 Calendar[DateKey]

    PREVIOUSQUARTER 函数有一个参数,一个包含连续日期范围的列。 在本例中,这是日历表中的 DateKey 列。

  9. 通过输入两个右括号))以关闭传递给 PREVIOUSQUARTER 函数和 CALCULATE 函数的所有参数。

    公式现在应如下所示:

    上季度销售额 = CALCULATE(SUM(Sales[SalesAmount]), PREVIOUSQUARTER(Calendar[DateKey]))

  10. 选择公式编辑栏中的 复选标记图标,或按 Enter 验证公式并将其添加到 Sales 表中。

你成功了! 你刚刚使用 DAX 创建了一个复杂的度量值。 此公式将执行的操作是计算上一季度的总销售额,具体取决于报表中应用的筛选器。 例如,我们可以将 SalesAmount 和新的上一季度销售额度量值从 Sales 表放入簇状柱形图中。 然后,从“日历”表中将 Year 添加为切片器,然后选择 2011。 然后,添加 QuarterOfYear 作为另一个切片器并选择 4,我们将获得如下所示的图表:

上一季度销售额和销售量图表

请记住,示例模型仅包含从 2011/1/1 到 1/19/2013 的少量销售数据。 如果选择了无法对 SalesAmount 求和的年份或季度,或者新度量值无法计算当前或上一季度的销售数据,则不会显示该时间段的数据。 例如,如果选择“2011 年”和 1“QuarterOfYear”,则不会显示上一季度销售额的数据,因为 2010 年第四季度没有数据。

你已了解 DAX 公式的几个重要方面:

  • 此公式包含两个函数。 PREVIOUSQUARTER(时间智能函数)作为传递给 CALCULATE 的参数嵌套,这是一个筛选器函数。

    DAX 公式最多可以包含 64 个嵌套函数。 公式不太可能包含这么多嵌套函数。 事实上,这样的公式很难创建和调试,而且它也可能不是快速的。

  • 在此公式中,还使用了筛选器。 筛选器将缩小要计算的内容的范围。 在这种情况下,你选择了一个筛选器作为参数,这实际上是另一个函数的结果。 稍后将了解有关筛选器的详细信息。

  • 你使用了 CALCULATE 函数。 此函数是 DAX 中最强大的函数之一。 创作模型并创建更复杂的公式时,可能会多次使用此函数。 尽管有关 CALCULATE 函数的进一步讨论超出了本文的范围,但随着对 DAX 的知识的增长,请特别注意它。

语法速测题

  1. 公式栏上的此按钮有什么作用?

    按钮选择

  2. 在 DAX 公式中,列名始终被什么包围?

本文末尾提供了答案。

Functions

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

DAX 包括以下类别的函数: 日期和时间时间智能信息逻辑数学统计文本父/子函数 和其他 函数。 如果你熟悉 Excel 公式中的函数,DAX 中的许多函数将如下所示:但是,DAX 函数在以下方面是唯一的:

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

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

  • DAX 包含许多返回表而不是值的函数。 该表未显示,但用于向其他函数提供输入。 例如,可以检索表,然后对表中的非重复值进行计数,或计算筛选表或列之间的动态总和。

  • DAX 包括各种时间智能函数。 这些函数允许定义或选择日期范围,并根据它们执行动态计算。 例如,可以比较并行周期的总和。

  • Excel 具有常用的函数 VLOOKUP。 DAX 函数不会像 Excel 中的 VLOOKUP 那样采用单元格或单元格区域作为引用。 DAX 函数采用列或表作为引用。 请记住,在 Power BI Desktop 中,你正在使用关系数据模型。 查找另一个表中的值非常简单,在大多数情况下,根本不需要创建任何公式。

    正如你所看到的,DAX 中的函数可以帮助你创建强大的公式。 我们只接触了函数的基础知识。 随着 DAX 技能的增长,你将使用许多不同的函数创建公式。 了解每个 DAX 函数的详细信息的最佳位置之一是在 DAX 函数参考中。

Functions QuickQuiz

  1. 函数总是引用什么内容?
  2. 公式是否可以包含多个函数?
  3. 将使用哪种类别的函数将两个文本字符串连接成一个字符串?

本文末尾提供了答案。

背景

上下文是最重要的 DAX 概念之一。 DAX 中有两种类型的上下文:行上下文和筛选器上下文。 我们将首先查看行上下文。

行上下文

行上下文最容易被视为当前行。 每当一个公式包含功能以通过应用筛选器来标识表中一行时,就会执行该功能。 该函数将在它筛选的表的每一行上自动应用行上下文。 这种类型的行上下文最常应用于度量值。

筛选器上下文

筛选器上下文比行上下文更难理解。 你可以最轻松地将筛选器上下文视为:在确定结果或值的计算中应用的一个或多个筛选器。

筛选器上下文并不是替代行上下文,而是在行上下文的基础上同时适用。 例如,若要进一步缩小要包括在计算中的值范围,可以应用筛选器上下文,该上下文不仅指定行上下文,而且还指定该行上下文中的特定值(筛选器)。

在报告中可以轻松查看筛选器的上下文。 例如,向可视化效果添加 TotalCost,然后添加 Year 和 Region 时,将定义一个筛选器上下文,该上下文基于给定年份和区域选择一部分数据。

为什么筛选器上下文对 DAX 如此重要? 你已经看到可以通过向可视化中添加字段来应用筛选器上下文。 还可以在 DAX 公式中应用筛选器上下文,方法是使用 ALL、RELATED、FILTER、CALCULATE 等函数,通过关系以及其他度量值和列来定义筛选器。 例如,让我们在名为 Store Sales 的度量值中查看以下公式:

商店销售度量值

为了更好地了解此公式,我们可以将其分解,就像使用其他公式一样。

此公式包含以下语法元素:

答: 度量值名称,Store Sales

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

C. CALCULATE 函数在上下文经过指定筛选器修改后,将表达式作为参数进行计算。

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

E. 在同一个表中,度量 [Total Sales] 是一个表达式。 Total Sales 度量值包含公式:=SUM(Sales[SalesAmount])。

F. 逗号 (),它将第一个表达式参数与筛选器参数分隔开来。

G. 完全限定的引用列 Channel[ChannelName]。 这是我们的行上下文。 此列中的每一行都指定一个通道,例如应用商店或 Online。

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

此公式确保仅计算由 Total Sales 度量值定义的销售值,仅计算 Channel[ChannelName] 列中的行,并将值 Store 用作筛选器。

正如你想象的,能够在公式中定义筛选器上下文具有巨大的强大功能。 仅引用相关表中的特定值的功能只是一个这样的示例。 如果你不立即完全理解上下文,请不要担心。 创建自己的公式时,可以更好地了解上下文以及 DAX 中为何如此重要。

背景快速测验

  1. 什么是两种类型的上下文?
  2. 什么是筛选器上下文?
  3. 什么是行上下文?

本文末尾提供了答案。

注意事项

请注意,虽然 Power Query 编辑器区分大小写,但在将数据加载到前端后,支持 Power BI 的 DAX 和 Analysis Services 引擎则不区分大小写。 编写 DAX 查询时,请记住这一区别。

总结

现在,你已基本了解 DAX 中最重要的概念,可以开始自行为度量值编写 DAX 公式。 DAX 确实可以有点棘手的学习,但有很多资源可供你使用。 阅读本文并尝试几个自己的公式后,可以了解有关其他 DAX 概念和公式的详细信息,这些概念和公式可以帮助你解决自己的业务问题。 有许多 DAX 资源可供你使用;最重要的是 数据分析表达式 (DAX) 参考

由于 DAX 在其他Microsoft BI 工具(如 Power Pivot 和 Analysis Services 表格模型)中已经存在了几年,因此有许多出色的源信息。 可以在Microsoft和领先的 BI 专业人员的书籍、白皮书和博客中找到更多信息。 DAX 资源中心也是一个很好的起点。

QuickQuiz 答案

Syntax:

  1. 验证度量值并将其输入到模型中。
  2. 方括号 []。

功能:

  1. 表和列。
  2. 是的。 公式最多可以包含 64 个嵌套函数。
  3. 文本函数

上下文:

  1. 行上下文和筛选器上下文。
  2. 计算中的一个或多个筛选器,用于确定单个值。
  3. 当前行。