快速入门:在 30 分钟内了解 DAX 基础知识

本快速入门面向对 Power Pivot in Excel 或对在 SQL Server Data Tools 中创作的表格模型项目不熟悉的用户。其目的是针对如何可以使用数据分析表达式 (DAX) 解决许多基本的数据建模和分析问题,向您提供快速简单的介绍。本主题包括概念性信息、您可以完成的一系列任务以及用于测试您所学内容的一些测验。在完成本主题后,您就应该对 DAX 中最基本的基础概念有了很好的了解。

什么是 DAX?

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

为何 DAX 如此重要?

创建工作簿并向其中导入一些数据的过程很轻松。您甚至可以不使用任何 DAX 公式,即可创建显示重要信息的数据透视表或数据透视图。但是,如果您需要跨多个产品类别和针对不同日期范围分析关键的销售数据,那该怎么办?或者,如果您需要组合来自不同数据源的若干表中的重要库存数据,又该怎么办?DAX 公式提供了这一功能以及许多其他重要功能。了解如何创建有效的 DAX 公式将帮助您最大限度地利用您的数据。当您获得所需的信息后,可以开始解决影响您的利润的实际业务问题。这就是商业智能,DAX 将帮助您实现它。

先决条件

您可能已经熟悉了如何在 Microsoft Excel 中创建公式。此知识将有助于您了解 DAX,但即使您对 Excel 公式没有任何经验,此处介绍的概念也将帮助您开始创建 DAX 公式和立即解决实际的商业智能问题。

我们将焦点移到特定于了解 DAX 公式在计算中使用。您应该已经熟悉这两种Power Pivot帮助中介绍的计算的列度量值(也称为计算字段) 的基本概念。您也应该熟悉Power Pivot创作环境和工具的 Excel 中。

示例工作簿

学习 DAX 的最佳方式是创建一些基本的公式,将其与某些实际数据结合使用并自行查看结果。这些示例和任务使用 Contoso Sample DAX Formulas.xlsx 工作簿。可以从 http://go.microsoft.com/fwlink/?LinkID=237472&clcid=0x409 下载此工作簿。在将此工作簿下载到您的计算机上之后,请将其打开,然后打开 Power Pivot 窗口。

现在开始!

我们将围绕三个非常重要的基础概念设置 DAX 的框架:“语法”、“函数”和“上下文”。当然,DAX 中还有其他重要概念,但了解这三个概念将为您增强 DAX 技能提供最佳基础。

语法

在创建您自己的公式之前,让我们先来了解 DAX 公式的语法。语法包括组成公式的不同元素,或者更简单地说,就是如何编写公式。例如,我们来看一个用于为 FactSales 表中名为 Margin 的计算列中的每一行创建新数据(值)的简单 DAX 公式(公式文本颜色仅用于阐述):

计算列公式

此公式的语法包括以下元素:

  1. 等号运算符 (=) 指示公式的开头,当计算此公式时,它将返回结果或值。用于计算值的所有公式都将以等号开头。

  2. 引用列 [SalesAmount] 包含我们要从中减去某个值的值。公式中的列引用始终由方括号 [] 括起来。与引用单元的 Excel 公式不同,DAX 公式始终引用列。

  3. 减 (-) 数学运算符。

  4. 引用列 [TotalCost] 包含我们要从 [SalesAmount] 列的值中减去的值。

在尝试了解如何解读 DAX 公式时,将其中每个元素分解为您日常思考和说话所用的语言通常会很有用。例如,您可按如下方式解读此公式:

在 FactSales 表中,对于 Margin 计算列中的每一行,通过从 [SalesAmount] 列的值中减去 (-) [TotalCost] 列中的值计算出 (=) 一个值。

我们来看一下另一种类型的公式,用于度量值中的一个︰

计算列公式

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

  1. Sum of Sales Amount 度量值名称。度量值的公式可以包括度量值名后, 跟冒号后, 跟计算公式。

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

  3. SUM 函数累加 [SalesAmount] 列中的所有数字。稍后您将了解有关函数的详细信息。

  4. 括号 () 括起一个或多个参数。所有函数都要求至少一个参数。一个参数向函数传递一个值。

  5. 引用表 FactSales。

  6. FactSales 表中的引用列 [SalesAmount]。通过此参数,Sum 函数可了解对哪一列累加以生成 SUM。

可按如下方式解读此公式:

度量值 中名为 Sum of Sales Amount,计算 (=) 值的总和 [ SalesAmount ] 列中的 FactSales 表。

当放入拖放区域的数据透视表字段列表中的值时,此度量值计算,并返回定义数据透视表,每个单元格的值,如移动电话在美国。

请注意,此公式与前面我们用于 Margin 计算列的公式相比存在一些不同点。尤其是,我们引入了一个“函数”:SUM。函数是预先编写的公式,旨在更轻松地对数字、日期、时间、文本等执行复杂的计算和操控。稍后您将了解有关函数的详细信息。

Margin 计算列与早期版本,您将看到 [SalesAmount] 列的前面加列所属的表 FactSales。这就是完全限定的列名称,因为它包含的表名称前面的列名称。在同一个表中引用的列不需要的表名称包含在公式中。这可能会使长公式引用多个列更短更容易阅读。但是,很好的做法始终包含度量值公式,即使是在同一个表中的表名称。

注意: 如果表名包含空格、保留关键字或不允许使用的字符,则必须将表名放在单引号中。如果名称包含 ANSI 字母数字字符范围之外的任何字符,还必须将表名称用引号引起来,而不管您的区域设置是否支持该字符集。

您的公式务必具有正确的语法。在大多数情况下,如果语法不正确,就会返回错误。在其他情况下,语法可能正确,但返回的值可能不是您所期望的。Power Pivot(和 SQL Server Data Tools)包含 IntelliSense;此功能用于帮助您选择正确的元素来创建语法正确的公式。

我们来创建一个简单的公式。此任务将帮助您进一步了解公式语法,以及编辑栏中的 IntelliSense 功能如何为您提供帮助。

任务:为计算列创建简单公式

  1. 如果您未处于 Power Pivot 窗口中,则在 Excel 中的 Power Pivot 功能区上,单击“Power Pivot 窗口”。

  2. 在 Power Pivot 窗口中,单击 FactSales 表(选项卡)。

  3. 滚动到最右侧的列,然后在列标题中单击“添加列”

  4. 单击沿模型设计器窗口顶部的编辑栏。

    PowerPivot 公式栏

    您的光标现在将出现在编辑栏中。编辑栏是您可以为计算列或计算字段键入公式的位置。

    我们花点时间来看一下位于编辑栏左侧的三个按钮。

    编辑 栏

    当光标在编辑栏中处于活动状态时,这三个按钮将变为活动状态。最左侧的按钮 X 只是一个取消按钮。单击此按钮。您的光标不再出现在编辑栏中,取消按钮和对勾标记按钮不再出现。继续,然后再次单击编辑栏。取消按钮和对勾标记按钮现在将再次出现。这意味着您已准备好,可以开始输入公式了。

    对勾标记按钮是检查公式按钮。在您输入了公式后,才会执行此命令。我们稍后将回过头来讨论此按钮。

    单击Fx按钮。您将看到,将出现一个新的对话框;插入函数对话框。插入函数对话框中的最简单的方法若要开始输入 DAX 公式。我们创建一个度量值略更高版本,但现在,您不需要将函数添加到您的计算的列公式时,我们将向公式添加函数。继续操作并关闭插入函数对话框。

  5. 在编辑栏中,键入等号 =,然后键入左方括号 [。此时将显示一个小的窗口,其中包含 FactSales 表中的所有列。这就是 IntelliSense 发挥了作用。

    由于计算列始终是在您所在的活动表中创建的,因此列名称前面不需要表名称。继续并向下滚动,然后双击 [SalesQuantity]。也可以滚动到所需的列名,然后按下 Tab 键。

    光标现在位于 [SalesQuantity] 的右侧且处于活动状态。

  6. 键入一个空格,然后键入减号运算符 -(负号),接着键入另一个空格。

  7. 现在,请键入另一个左方括号 [。此时,选择 [ReturnQuantity] 列,然后按 Enter。

    如果出现错误,请仔细检查您的语法。如果需要,则将其与前面介绍的 Margin 计算列中的公式进行比较。

    在按 Enter 以完成公式之后,“正在计算”将显示在 Power Pivot 窗口底部的状态栏中。此过程非常快,即使您刚刚为超过三百万行计算了新值,也会很快。

  8. 右键单击列标题并将此列重命名为 NetSales。

搞定!您刚刚创建了一个简单但功能非常强大的 DAX 公式。对于 FactSales 表中的“每一”行,NetSales 公式都将通过从 [SalesQuantity] 列中的值减去 [ReturnQuantity] 中的值来计算一个值。请注意,我们刚刚说了“对于每一行”。这就引入了 DAX 中另一个非常重要的概念:“行上下文”。稍后您将了解有关行上下文的详细信息。

提示: 

在向 DAX 公式中键入运算符时,真正务必了解的是您要在参数中使用的数据类型。例如,如果您键入的是以下公式 = 1 & 2,则返回的值为文本值“12”。这是因为与号 (&) 运算符用于对文本进行串联。DAX 按以下方式解读此公式:通过将值 1 作为文本来计算结果,然后加上值 2(作为文本)。现在,如果您键入的是 = 1 + 2,DAX 将按如下所示解读此公式:将数值 1 加上数值 2 来计算结果。结果当然为数值“3”。DAX 根据公式中的运算符(而不根据参数中使用的列的数据类型)来计算结果值。DAX 中的数据类型非常重要,但超出了本快速入门的讨论范围。若要了解有关 DAX 公式中的数据类型和运算符的详细信息,请参阅联机丛书中的“DAX 参考”(http://go.microsoft.com/fwlink/?LinkId=239769&clcid=0x409)。

我们来尝试另一个。此时,键入公式和使用智能感知,您将创建一个度量值。不要担心过多 if 完全不了解公式。下面是重要的是,了解如何创建在正确的语法一起使用的几个元素的公式。

任务︰ 创建一个度量值的公式

  1. FactSales 表中,单击“计算区域”中的任意空单元格。这是位于 Power Pivot 窗口中某个表正下方的空单元格区域。

PowerPivot 计算区域

  1. 在编辑栏中,键入名称 Previous Quarter Sales:

  2. 键入一个等号 = 以开始计算公式。

  3. 键入前几个字母 CAL,然后双击要使用的函数。在此公式中,您要使用 CALCULATE 函数。

  4. 键入左括号 ( 以开始键入要传递到 CALCULATE 函数的参数。

    注意,在键入左括号之后,IntelliSense 将显示 CALCULATE 函数所需的参数。稍后您将了解参数。

  5. 键入 FactSales 表的前几个字母,然后在下拉列表中双击 FactSales[Sales]

  6. 键入一个逗号 (,) 以指定第一个筛选器,接着键入 PRE,然后双击 PREVIOUSQUARTER 函数。

    在选择 PREVIOUSQUARTER 函数之后,将出现另一个左括号,表明需要另一参数;此时是用于 PREVIOUSQUARTER 函数的参数。

  7. 键入前几个字母 Dim,然后双击 DimDate[DateKey]

  8. 通过键入两个右括号 )),结束传递给 PREVIOUSQUARTER 函数和 CALCULATE 函数的参数。

    公式现在应如下所示:

    Previous Quarter Sales:=CALCULATE(FactSales[Sales], PREVIOUSQUARTER(DimDate[DateKey]))

  9. 单击编辑栏中的检查公式按钮以验证此公式。如果您收到错误,请验证语法的每个元素。

你做到了!您刚创建使用 DAX,并不在的简单一个度量值。此公式将执行的操作是计算上一季度,具体取决于数据透视表或数据透视图中应用的筛选器总销售额。

您刚刚见识了 DAX 公式的几个重要环节。首先,该公式包含两个函数。请注意,PREVIOUSQUARTER 函数将作为一个传递到 CALCULATE 函数的参数嵌套在后者中。DAX 公式可以包含多达 64 个嵌套函数。一个公式不太可能包含如此多的嵌套函数。实际上,此类公式很难创建和调试,因此,它可能不会非常快。

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

最后,您使用了 CALCULATE 函数。这是 DAX 中功能最强大的函数之一。当您创作数据模型并创建更复杂的公式时,可能需要多次使用此函数。对于 CALCULATE 函数的讨论超出了本快速入门的范围,但随着您对 DAX 的知识的增长,应特别留意此函数。

注意: 通常,要在 DAX 公式中使用时间智能函数,必须通过使用“标记为日期表”对话框指定一个唯一日期列。在 Contoso DAX Formula Samples.xlsx 工作簿中,选择 DimDate 表中的 DateKey 列作为唯一的数据列。

额外知识

您可能会问: 是什么可以创建的最简单的 DAX 公式?嗯,问题的答案是未与公式。然后,这正是中度量值使用标准聚合函数可以执行哪些操作。几乎任何数据模型需要筛选和聚合数据计算。例如,您刚才 Sum of Sales Amount 度量值中的 SUM 函数用于将特定列中的所有数字相加。DAX 中包含多个聚合值以及其他功能。您可以自动创建通过使用自动求和功能使用标准聚合公式。

额外知识任务︰ 使用自动求和功能创建一个度量值的公式

  1. 在表 FactSales 中,滚动到 ReturnQuantity 列,然后单击列标题以选择整列。

  2. 在功能区上的“开始”选项卡中,在“计算”组中单击“自动求和”按钮。

PowerPivot 中的自动求和

  1. 单击自动求和,旁边的下拉箭头,然后单击 Average (请注意的其他标准聚合函数您也可以使用太)。
    立即,将新的度量值创建使用名称 Average of ReturnQuantity︰ 后跟公式 = AVERAGE([ReturnQuantity])。

现在还不容易吗?当然,并非您创建的所有公式都如此简单。但是,通过使用“自动求和”功能,您可以使用标准聚合计算创建快速且简单的公式。

这应让您对 DAX 公式中使用的语法有一个很好的了解。此外,还向您引入了一些实在很酷的功能(如 IntelliSense 和“自动求和”),以帮助您创建快速、简单和精确的公式。当然,有关语法,您有大量的内容可以学习。可供您了解详细信息的好地方是 DAX 参考或 SQL 联机丛书。

语法快速测验

  1. 编辑栏上的此按钮有什么用途?
    函数按钮

  2. 在 DAX 公式中始终用什么将列名括起来?

  3. 如何编写执行以下操作的公式:
    在 DimProduct 表中,对于 UnitMargin 计算列中的每一行,通过从 UnitPrice 列的值中减去 UnitCost 列中的值计算出一个值

本主题的末尾提供了答案。

函数

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

DAX 包括以下函数“类别”:日期和时间、信息、逻辑、数学、统计、文本以及时间智能函数。如果您熟悉 Excel 公式中的函数,则会发现 DAX 中的许多函数很相似;但 DAX 公式在以下方面很独特:

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

  • 如果需要逐行自定义计算,DAX 可提供让您使用当前行值或相关值作为一种参数来执行计算(因上下文而异)的函数。稍后您将了解有关上下文的详细信息。

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

  • DAX 包含多种“时间智能”函数。利用这些函数,您可以定义或选择日期范围,并基于它们执行动态计算。例如,您可以比较并行时段内的总和。

有时难以知道您在公式可能需要使用哪些函数。Power Pivot 以及 SQL Server Data Tools 中的表格模型设计器包括“插入函数”功能,这是一个对话框,可帮助您按类别选择函数并提供每个函数的简短说明。

插入函数

现在,我们使用“插入函数”功能创建一个新公式,其中包含您将选择的函数:

任务:使用“插入函数”向公式添加函数

  1. 在 FactSales 表中,滚动到最右侧的列,然后在列标题中单击“添加列”。

  2. 在编辑栏中键入等号 =。

  3. 单击“插入函数”按钮。 插入函数 此时将打开“插入函数”对话框。

  4. 在“插入函数”对话框中,单击“选择类别”列表框。默认情况下,将选中“所有”,并且下方将列出“所有”类别的所有函数。其中有大量的函数,因此您需要筛选函数,以便能够更轻松地找到您要查找的函数类型。

  5. 对于此公式,您希望返回另一个表中已存在的某些数据。为此,您要使用“筛选器”类别中的一个函数。继续并单击“筛选器”类别,然后在“选择函数”中,向下滚动并双击 RELATED 函数。单击“确定”以关闭“插入函数”对话框。

  6. 使用 IntelliSense 帮助您查找和选择 DimChannel[ChannelName] 列。

  7. 关闭公式,然后按 Enter。

  8. 在按 Enter 以完成公式之后,“正在计算”将显示在 Power Pivot 窗口底部的状态栏中。现在,您将看到刚刚使用 DimChannel 表中的渠道信息在 FactSales 表中创建了一个新列。

  9. 将此列重命名为 Channel。

    您的公式应如下所示:=RELATED(DimChannel[ChannelName])

刚刚向您介绍了 DAX 中另一非常重要的函数 RELATED 函数。RELATED 函数返回另一个表中的值。当您目前所在的表与包含您要获取的值的表之间存在关系时,您可以使用 RELATED。当然,RELATED 函数具有无限的可能性。在这种情况下,您现在可以在 FactSales 表中包括每笔销售的销售渠道。您现在可以从数据透视表字段列表中隐藏 DimChannel 表,以更便于导航和只查看确实需要的最重要信息。与前面介绍的 CALCULATE 函数很类似,RELATED 函数也非常重要,您将多次使用它。

正如您所看到的,DAX 中的函数可帮助您创建功能非常强大的公式。我们实际上只探讨了函数的基本知识。随着您的 DAX 技能得到改进,您将使用许多不同函数创建公式。了解有关所有 DAX 函数的详细信息的最佳位置之一是数据分析表达式 (DAX) 参考

函数快速测验

  1. 函数始终引用什么?

  2. 一个公式可以包含多个函数吗?

  3. 应使用哪种“类别”的函数将两个字符串“串联”成一个字符串?

本主题的末尾提供了答案。

上下文

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

行上下文

行上下文最容易被视作当前行。例如,还记得学习语法时在前面介绍的 Margin 计算列吗?公式 =[SalesAmount] - [TotalCost] 针对表中的每一行计算 Margin 列中的一个值。每行的值可通过同一行的其他两列 [SalesAmount] 和 [TotalCost] 中的值进行计算得出。DAX 可以计算 Margin 列中每行的值,因为它具有上下文:对于每一行,它将采用 [TotalCost] 列中的值,并从 [SalesAmount] 列的值中减去前面的值。

在下面所示的所选单元中,当前行中的值 $49.54 的计算方式为:从 [SalesAmount] 列的值 $101.08 中减去 [TotalCost] 列中的值 $51.54。

PowerPivot 中的行上下文

只需行上下文不适用于计算列。行上下文也适用只要公式中包含应用了筛选器来标识表中的单个行的函数。该函数将本身应用每行的表的筛选行上下文。这种类型的行上下文最常适用范围度量值。

筛选上下文

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

筛选上下文不能替代行上下文;而是在应用行上下文之外应用。例如,要进一步缩小计算中要包含的值的范围,您可以应用一个筛选上下文,该上下文不仅指定行上下文,也指定该行上下文中的一个特定值(筛选器)。

可以在数据透视表中轻松地查看筛选上下文。例如,当您将 TotalCost 添加到“值”区域,然后将 Year 和 Region 添加到行或列时,您就定义了一个筛选上下文,此上下文将基于给定的年份和区域选择数据子集。

为什么是筛选上下文到 DAX 如此重要?因为虽然通过在数据透视表中添加列和行标签和切片器可以很容易应用筛选上下文,筛选上下文也可应用在 DAX 公式中定义筛选器使用函数,例如相关、 筛选器、 计算,通过关系,以及其他度量值和列。例如,我们来看一下以下公式中名为 StoreSales 度量值︰

公式

很明显,此公式比您前面看到的一些其他公式更复杂。但是,为了更好地理解此公式,我们可以将其分解,这与对待其他公式的方式很相似。

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

  1. 度量值名称 StoreSales 后, 跟冒号:。

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

  3. CALCULATE 函数在由指定筛选器修改的上下文中计算表达式(作为参数)。

  4. 括号 () 括起一个或多个参数。

  5. 在同一个表表达式作为度量 [Sales]。销售额度量具有公式: = SUM(FactSales[SalesAmount])。

  6. 逗号 (,) 分隔每个筛选器。

  7. 引用列和特定值 DimChannel[ChannelName] =”Store”,作为一个筛选器。

此公式将确保仅计算的销售值由销售额度量作为一个筛选器是仅对具有值"Store",作为一个筛选器 DimChannel [ChannelName] 列中的行。

正如您所想像的,可以在公式中定义筛选上下文意味着巨大且强大的功能。能够仅引用相关表中的特定值只是这样的示例之一。如果您未能立即完全了解上下文,请不要担心。当您创建自己的公式时,您将更好地了解上下文以及它在 DAX 中如此重要的原因。

上下文快速测验

  1. 两种类型的上下文是什么?

  2. 什么是筛选上下文?

  3. 什么是行上下文?

本主题的末尾提供了答案。

总结

现在,您有 DAX 中的基本了解最重要的概念,您可以开始创建您自己的 DAX 公式的计算的列和度量值。DAX 确实可以一些技巧,若要了解,但有许多资源可用于您。后阅读本主题通过几次,并使用您自己的公式的一些体验,您可以了解有关其他 DAX 概念的详细信息和公式,可帮助您解决自己的业务问题。有许多 DAX 资源适用于您在Power Pivot帮助、 SQL Server 联机丛书、 白皮书和博客从 Microsoft 和前导 BI 专业人员。DAX 资源中心 Wiki (http://social.technet.microsoft.com/wiki/contents/articles/dax-resource-center.aspx) 是一个好的位置,以开始。数据分析表达式 (DAX) 参考也是好的资源。请务必将其保存在您的收藏夹。

“商业智能表格模型中的 DAX”白皮书可供下载 (http://go.microsoft.com/fwlink/?LinkID=237472&clcid=0x804),它提供了有关此处介绍的概念的更详细说明以及许多其他高级概念和公式。此白皮书还使用您已有的同一个 Contoso DAX Sample Formulas.xlsx 工作簿。

快速测验答案

语法:

  1. 打开“插入函数”功能。

  2. 方括号 []。

  3. =[UnitPrice] - [UnitCost]

函数:

  1. 表和列。

  2. 可以。一个公式可以包含多达 64 个嵌套函数。

  3. 文本函数.

上下文:

  1. 行上下文和筛选上下文。

  2. 在确定单个值的计算中使用的一个或多个筛选器。

  3. 当前行。

注释: 

  • 机器翻译免责声明:本文是由无人工介入的计算机系统翻译的。Microsoft 提供机器翻译是为了帮助非英语国家/地区用户方便阅读有关 Microsoft 产品、服务和技术的内容。由于机器翻译的原因,本文可能包含词汇、语法或文法方面的错误。

  • 请在 此处 中查找本文的英文版本以便参考。你和 Microsoft 社区的其他成员可以使用 Community Translation Framework (CTF) 来改进本文。只需将鼠标悬停在文章中的句子上,然后在 CTF 小组件中单击“IMPROVE TRANSLATION”即可。 单击此处了解有关 CTF 的详细信息。 使用 CTF 即表示你同意服务条款

扩展你的技能
了解培训
抢先获得新功能
加入 Office 预览体验计划

此信息是否有帮助?

谢谢您的反馈!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×