什么是 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 公式(公式文本颜色仅用于阐述):

计算列公式
在这里插入图片描述
此公式的语法包括以下元素:

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

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

减 (-) 数学运算符。

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

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

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

我们来看一下另一种类型的公式,用于度量值中的一个:
在这里插入图片描述
计算列公式

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

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

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

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

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

引用表 FactSales。

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 公式。我们创建一个度量值略更高版本,但现在,您不需要将函数添加到您的计算的列公式时,我们将向公式添加函数。继续操作并关闭插入函数对话框。

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

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

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

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

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

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

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

右键单击列标题并将此列重命名为 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 问答 = 0x409) 联机丛书中。

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

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

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

在这里插入图片描述
PowerPivot 计算区域

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

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

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

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

    注意,在键入左括号之后,IntelliSense 将显示 CALCULATE 函数所需的参数。稍后您将了解参数。
    
  • 键入 FactSales 表的前几个字母,然后在下拉列表中双击 FactSales[Sales]。

  • 键入一个逗号 (,) 以指定第一个筛选器,接着键入 PRE,然后双击 PREVIOUSQUARTER 函数。在选择 PREVIOUSQUARTER 函数之后,将出现另一个左括号,表明需要另一参数;此时是用于 PREVIOUSQUARTER 函数的参数。

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

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

公式现在应如下所示:

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

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

你做到了!您刚创建使用 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 中包含多个聚合值以及其他功能。您可以自动创建通过使用自动求和功能使用标准聚合公式。

函数

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

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

  • DAX 函数始终引用完整的列或表。如果您想要仅使用表或列中的特定值,则可以向公式中添加筛选器。
  • 如果需要逐行自定义计算,DAX可提供让您使用当前行值或相关值作为一种参数来执行计算(因上下文而异)的函数。稍后您将了解有关上下文的详细信息。
  • DAX包含的许多函数都将返回表,而不是返回值。表不会显示,而是用于向其他函数提供输入。例如,您可以检索一个表,然后对该表中的非重复值进行计数,或者计算多个已筛选表或列的动态总和。
  • DAX 包含多种“时间智能”函数。利用这些函数,您可以定义或选择日期范围,并基于它们执行动态计算。例如,您可以比较并行时段内的总和。

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

RELATED 函数。RELATED 函数返回另一个表中的值。当您目前所在的表与包含您要获取的值的表之间存在关系时,您可以使用 RELATED。
正如你所看到的,DAX 中的函数可帮助您创建功能非常强大的公式。我们实际上只探讨了函数的基本知识。随着您的 DAX 技能得到改进,您将使用许多不同函数创建公式。了解有关所有 DAX 函数的详细信息的最佳位置之一是数据分析表达式 (DAX) 参考。

上下文

上下文是要了解的最重要的 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 度量值:
在这里插入图片描述

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

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

  • 度量值名称 StoreSales 后, 跟冒号:。
  • 等号运算符 (=) 指示公式的开头。
  • CALCULATE 函数在由指定筛选器修改的上下文中计算表达式(作为参数)。
  • 括号 () 括起一个或多个参数。
  • 在同一个表表达式作为度量 [Sales]。销售额度量具有公式: = SUM(FactSales[SalesAmount])。
  • 逗号 (,) 分隔每个筛选器。
  • 引用列和特定值 DimChannel[ChannelName] =”Store”,作为一个筛选器。

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

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

点击阅读全文
Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐