DAX 概述

数据分析表达式 (DAX) 是在 Excel 中的 Analysis Services、Power BI 和 Power Pivot 中使用的公式表达式语言。 DAX 公式包括函数、运算符和值,用于对表格数据模型中相关表和列中的数据执行高级计算和查询。

本文仅对DAX中最重要的概念进行基本介绍。 它描述了 DAX 在所有使用该技术的产品中的应用。 某些功能可能不适用于某些产品或用例。 请参阅贵产品的文档,了解其对DAX的特定实现。

计算

DAX 公式在度量值、计算列、计算表和行级别安全性中使用。

措施

度量值是动态计算公式,其中结果会根据上下文而变化。 度量值在支持使用多个属性(如 Power BI 报表或 Excel 数据透视表或数据透视图)组合和筛选模型数据的报表中使用。 度量值是通过模型设计器中的DAX公式栏创建的。

度量值中的公式可以使用使用自动求和功能创建的标准聚合函数,例如COUNT或SUM,或者可以通过公式编辑栏DAX定义自己的公式。 命名度量值可以作为参数传递给其他度量值。

在公式栏中为度量值定义公式时,工具提示功能会显示当前上下文中合计结果的预览,否则不会立即将结果输出到任何位置。 无法立即看到(筛选)计算结果的原因是,在没有上下文的情况下无法确定度量值的结果。 若要计算度量值,需要一个报告客户端应用程序,该应用程序可以提供检索与每个单元格相关的数据的上下文,然后计算每个单元格的表达式。 该客户端可能是 Excel 数据透视表或数据透视图、Power BI 报表或 SQL Server Management Studio (SSMS) 中 DAX 查询中的表表达式。

无论客户端如何,都会针对结果中的每个单元格运行单独的查询。 也就是说,数据透视表中的行标题和列标题的每个组合,或 Power BI 报表中的切片器和筛选器的每个选择都会生成一个不同的数据子集,用于计算度量值。 例如,使用此非常简单的度量值公式:

Total Sales = SUM([Sales Amount])

当用户将 TotalSales 度量值放在报表中,然后将“产品类别”列中的产品类别列放入“筛选器”中时,将计算并显示每个产品类别的销售金额之和。

与计算列不同,度量值的语法包括公式前面的度量值名称。 在刚刚提供的示例中,公式前面会显示总 销售额 名称。 创建度量值后,其名称和定义将出现在报告客户端应用程序的字段列表中,并且根据不同的视角和角色,模型的所有用户都可以访问。

要了解详细信息,请参阅:Power BI Desktop 中的度量值Analysis Services 中的度量值Power Pivot 中的度量值

计算列

计算列是添加到现有表(在模型设计器中)的列,然后创建定义 DAX 列值的公式。 当计算列包含有效的 DAX 公式时,只要输入公式,就会为每个行计算值。 然后,值存储在内存中的数据模型中。 例如,在“日期”表中,在公式栏中输入公式后:

= [Calendar Year] & " Q" & [Calendar Quarter]

表中每行的值是通过从(同一个“日期”表中的)“日历年”列获取值来计算的,添加一个空格和大写字母 Q,然后添加(同一个“日期”表中的)“日历季度”列的值。 计算列中每一行的结果将立即计算并显示,例如,如 2017 年第 1 季度。 仅当处理表或任何相关表(刷新)或模型从内存中卸载,然后重新加载,例如关闭和重新打开 Power BI Desktop 文件时,才会重新计算列值。

要了解详细信息,请参阅:Power BI Desktop 中的计算列Analysis Services 中的计算列Power Pivot 中的计算列

计算表

计算表是基于公式表达式的计算对象,派生自同一模型中其他表的所有或部分。 DAX 公式定义表值,而非从数据源中查询值并将值加载到新表的列中。

计算表在角色扮演维度中非常有用。 例如“日期”表,如 OrderDate、ShipDate 或 DueDate,具体取决于外键关系。 通过显式创建 ShipDate 的计算表,您可以获得一张独立的表,该表可以用于查询,其功能与任何其他表一样全面。 在配置筛选的行集或其他现有表中列的子集或超集时,计算表也很有用。 这样,就可以在创建该表的变体以支持特定方案的同时,使原始表保持不变。

计算表支持与其他表之间的关系。 计算表中的列具有数据类型、格式设置,并且可以属于数据类别。 计算表可以命名和显示或隐藏,就像任何其他表一样。 如果计算表从其中提取数据的任何表刷新或更新,则将重新计算计算表。

若要了解详细信息,请参阅:Power BI Desktop 中的计算表Analysis Services 中的计算表

行级安全性

使用行级别安全性时,DAX 公式的计算结果必须为 TRUE/FALSE 布尔值条件,以定义特定角色成员的查询结果可以返回哪些行。 例如,对于“销售”角色的成员,具有以下 DAX 公式的“客户”表:

= Customers[Country] = "USA"

“销售”角色的成员只能查看美国客户的数据,某些汇总(例如 SUM)仅针对美国的客户返回。 Excel 中的 Power Pivot 中不提供行级别安全性。

使用 DAX 公式定义行级别安全性时,将创建一个允许的行集。 这不会拒绝对其他行的访问;相反,它们只是不作为允许的行集的一部分返回。 其他角色可以访问被DAX公式排除的行。 如果用户是另一个角色的成员,并且该角色的行级别安全性允许访问该特定行集,则用户可以查看该行的数据。

行级安全公式适用于指定的行和相关行。 如果表具有多个关系,筛选器将对处于活动状态的关系应用安全性。 行级别安全公式将与为相关表定义的其他公式相交。

要了解详细信息,请参阅:Power BI 的行级安全性 (RLS)Analysis Services 中的角色

查询

DAX 可以在 SQL Server Management Studio(SSMS)和开源工具(如 DAX Studio(daxstudio.org)中创建和运行查询。 与只能在表格数据模型中创建的计算公式不同 DAX , DAX 还可以针对 Analysis Services 多维模型运行查询。 DAX 与多维数据表达式 (MDX) 查询相比,查询通常更易于编写和更高效。

DAX查询是一个语句,类似于 T-SQL 中的 SELECT 语句。 最基本的查询类型 DAX 是 evaluate 语句。 例如,

EVALUATE
 ( FILTER ( 'DimProduct', [SafetyStockLevel] < 200 ) )
ORDER BY [EnglishProductName] ASC

在“结果”中返回一个表,其中仅按 EnglishProductName 升序列出 SafetyStockLevel 小于 200 的产品。

可以创建度量值作为查询的一部分。 度量值仅在查询持续时间内存在。 若要了解详细信息,请参阅 DAX 查询

公式

DAX 公式对于在计算列和度量值中创建计算,以及在使用行级别安全性保护数据方面非常重要。 若要为计算列和度量值创建公式,请使用模型设计器窗口或编辑器顶部的 DAX 公式栏。 若要为行级别安全性创建公式,请使用“角色管理器”或“管理角色”对话框。 本部分中的信息旨在帮助你开始了解公式的 DAX 基础知识。

公式基础知识

DAX 公式可能非常简单或相当复杂。 下表显示了可在计算列中使用的简单公式的一些示例。

公式 定义
= TODAY() 在计算列的每一行中插入今天的日期。
= 3 在计算列的每一行中插入值 3。
= [Column1] + [Column2] 将值添加到 [Column1] 和 [Column2] 的同一行中,并将结果放入同一行的计算列中。

无论创建的公式是简单还是复杂,都可以在生成公式时使用以下步骤:

  1. 每个公式必须以等号 (=) 开头。

  2. 可以键入或选择函数名称,也可以键入表达式。

  3. 开始键入所需的函数或名称的前几个字母,AutoComplete 将显示可用函数、表和列的列表。 按 Tab 将“自动完成”列表中的项添加到公式。

    还可以单击 Fx 按钮以显示可用函数的列表。 若要从下拉列表中选择函数,请使用箭头键突出显示该项,然后单击“ 确定 ”将函数添加到公式。

  4. 从可能的表和列的下拉列表中选择参数,或通过键入值来向函数提供参数。

  5. 检查语法错误:确保关闭所有括号,并正确引用列、表和值。

  6. 按 Enter 接受公式。

注释

在计算列中,输入公式并验证公式后,该列就会填充值。 在度量值中,按 Enter 键会将度量值定义与表一起保存。 如果公式无效,则会显示错误。

在此示例中,让我们在名为 “当前季度中的天数”的度量值中查看公式:

Days in Current Quarter = COUNTROWS( DATESBETWEEN( 'Date'[Date], STARTOFQUARTER( LASTDATE('Date'[Date])), ENDOFQUARTER('Date'[Date])))

此度量值用于在不完整的时间段和上一个时间段之间创建比较比率。 公式必须考虑到已用期间的比例,并将其与上一个时间段中的同一比例进行比较。 在本示例中,[Days Current Quarter to Date]/[Days in Current Quarter] 提供当前时间段内已经过的比例。

此公式包含以下元素:

公式元素 说明
Days in Current Quarter 度量值的名称。
= 等号 (=) 开始公式。
COUNTROWS COUNTROWS 计算 Date 表中的行数
() 左括号和右括号指定参数。
DATESBETWEEN DATESBETWEEN 函数返回“日期”表“日期”列中每个值的最后日期之间的日期。
'Date' 指定“日期”表。 表采用单引号。
[Date] 指定“日期”表中的“日期”列。 列用方括号括起来。
,
STARTOFQUARTER 该 STARTOFQUARTER 函数返回季度开始日期。
LASTDATE 该 LASTDATE 函数返回季度的最后一个日期。
'Date' 指定“日期”表。
[Date] 指定“日期”表中的“日期”列。
,
ENDOFQUARTER ENDOFQUARTER 函数
'Date' 指定“日期”表。
[Date] 指定“日期”表中的“日期”列。

使用公式自动完成

AutoComplete 通过提供公式中每个元素的选项来帮助输入有效的公式语法。

  • 可以在具有嵌套函数的现有公式的中间使用公式自动完成功能。 插入点前的文本用于在下拉列表中显示值,插入点后的所有文本保持不变。

  • AutoComplete 不会添加函数的结束括号,也不会自动匹配括号。 必须确保每个函数语法正确,或者无法保存或使用公式。

在公式中使用多个函数

可以嵌套函数,这意味着将一个函数的结果用作另一个函数的参数。 最多可以在计算列中嵌套 64 个级别的函数。 但是,嵌套可能会导致公式的创建或故障排除更加困难。 许多函数旨在仅用作嵌套函数。 这些函数返回无法直接保存为结果的表;它必须作为表函数的输入提供。 例如,函数SUMXAVERAGEX和MINX所有函数都需要表作为第一个参数。

功能

函数是表达式中的命名公式。 大多数函数具有必需参数和可选参数,也称为参数作为输入。 执行函数时,将返回一个值。 DAX 包括可用于使用日期和时间执行计算的函数、创建条件值、处理字符串、基于关系执行查找,以及循环访问表以执行递归计算的能力。 如果你熟悉 Excel 公式,其中许多函数将非常类似:但是, DAX 公式在以下重要方面有所不同:

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

  • 如果需要逐行自定义计算,DAX 提供一些函数,您可以将当前行的值或相关值用作参数来进行计算,并根据上下文进行不同的运算。 若要了解这些函数的工作原理,请参阅本文中的 上下文

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

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

聚合函数

聚合函数计算由表达式定义的列或表中所有行的(标量)值,例如计数、求和、平均值、最小值或最大值。 若要了解详细信息,请参阅 聚合函数

日期和时间函数

中的 DAX 日期和时间函数类似于 Microsoft Excel 中的日期和时间函数。 但是, DAX 函数基于从 1900 年 3 月 1 日起的 日期/ 时间数据类型。 若要了解详细信息,请参阅 日期和时间函数

筛选器函数

DAX 中的筛选器函数返回特定数据类型、查找相关表中的值,并按相关值进行筛选。 查找函数使用表和关系(如数据库)工作。 通过筛选函数可以操作数据上下文来创建动态计算。 若要了解详细信息,请参阅 筛选器函数

财务函数

其中 DAX 的财务函数用于执行财务计算的公式,例如净现值和回报率。 这些函数类似于Microsoft Excel 中使用的财务函数。 若要了解详细信息,请参阅 财务功能

信息函数

信息函数将查看作为参数提供的单元格或行,并告知值是否与预期类型匹配。 例如,如果引用的值包含错误,ISERROR 函数将返回 TRUE。 若要了解详细信息,请参阅 信息函数

逻辑函数

逻辑函数对表达式执行作,以返回有关表达式中的值的信息。 例如,TRUE 函数可让你知道正在计算的表达式是否返回 TRUE 值。 若要了解详细信息,请参阅 逻辑函数

数学和三角函数

中的 DAX 数学函数与 Excel 数学和三角函数非常相似。 函数使用的 DAX 数值数据类型存在一些细微差异。 若要了解详细信息,请参阅 “数学”和“三元”函数

其他函数

这些函数执行具有唯一动作的操作,这些动作无法被任何其他函数所属的类别所定义。 若要了解详细信息,请参阅 其他函数

关系函数

使用关系函数 DAX 可以返回另一个相关表中的值,指定要在表达式中使用的特定关系,并指定交叉筛选方向。 若要了解详细信息,请参阅 关系函数

统计函数

统计函数计算与统计分布和概率相关的值,例如标准偏差和排列数。 若要了解详细信息,请参阅 统计函数

文本函数

中的 DAX 文本函数与 Excel 中的对应函数非常相似。 可以返回字符串的一部分、搜索字符串中的文本或连接字符串值。 DAX 还提供用于控制日期、时间和数字格式的函数。 若要了解详细信息,请参阅 文本函数

时间智能函数

DAX 中提供的时间智能函数使你可以创建使用日历和日期相关内置知识的计算。 通过将时间和日期范围与聚合或计算结合使用,可以在可比较的时间段内为销售、库存等生成有意义的比较。 若要了解详细信息,请参阅 时间智能函数 (DAX)

表操作函数

这些函数返回表或操作现有表。 例如,通过使用 ADDCOLUMNS 可以将计算列添加到指定表,或者可以使用 SUMMARIZECOLUMNS 函数在一组组上返回一个摘要表。 若要了解详细信息,请参阅 表作函数

变量

可以在表达式中使用 VAR 来创建变量。 VAR 在技术上不是函数,它是将表达式的结果存储为命名变量的关键字。 然后,可以将该变量作为参数传递给其他度量值表达式。 例如:

VAR
    TotalQty = SUM ( Sales[Quantity] )

Return

    IF (
        TotalQty > 1000,
        TotalQty * 0.95,
        TotalQty * 1.25
        )

在此示例中,TotalQty 可以作为命名变量传递给其他表达式。 变量可以是任何标量数据类型,包括表。 在 DAX 公式中使用变量的功能非常强大。

数据类型

可以将数据从许多可能支持不同数据类型的不同数据源导入模型。 将数据导入模型时,数据将转换为表格模型数据类型之一。 在计算中使用模型数据时,数据随后会转换为 DAX 计算持续时间和输出的数据类型。 创建 DAX 公式时,公式中使用的术语将自动确定返回的值数据类型。

DAX 支持以下数据类型:

模型中的数据类型 DAX 中的数据类型 说明
Whole Number 64 位(八字节)整数值 1、2 没有小数位数的数字。 整数可以是正数或负数,但必须是介于 -9,223,372,036,854,775,808(-2^63)和 9,223,372,036,854,775,807(2^63-1)之间的整数。
Decimal Number 64 位(8 字节)实数 1、2 实数是可具有小数位数的数字。 实数涵盖广泛的数值范围。

负值包含 -1.79E +308 到 -2.23E -308



正值从 2.23E -308 到 1.79E + 308

但是,有效位数限制为 17 位十进制数字。
Boolean 布尔 True 或 False 值。
Text 字符串 Unicode 字符数据字符串。 可以是文本格式表示的字符串、数字或日期。
Date 日期/时间 采用接受的日期/时间表示形式的日期和时间。

有效日期都是 1900 年 3 月 1 日之后的所有日期。
Currency 货币 货币数据类型允许介于 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 之间的值,具有四个固定精度的小数位数。
N/A 空白 在 DAX 中,空值是一种表示并替代 SQL null 的数据类型。 可以使用函数创建空白 BLANK ,并使用逻辑函数 ISBLANK测试空白。

表格数据模型还包括 数据类型作为许多 DAX 函数的输入或输出。 例如,该 FILTER 函数将表作为输入并输出另一个仅包含满足筛选条件的行的表。 通过将表函数与聚合函数组合在一起,可以对动态定义的数据集执行复杂的计算。

虽然数据类型通常是自动设置的,但请务必了解数据类型以及它们如何(特别是)应用于 DAX 公式。 例如,公式或意外结果中的错误通常由不能与参数中指定的数据类型一起使用的特定运算符引起。 例如,公式 = 1 & 2返回字符串结果 12。 但是, = "1" + "2"公式返回 3 的整数结果。

上下文

上下文 是创建 DAX 公式时要了解的重要概念。 上下文使你能够执行动态分析,因为公式的结果可以反映当前行或单元格选择以及任何相关数据。 了解上下文和有效地使用上下文对于生成高性能、动态分析以及解决公式中的问题至关重要。

表格模型中的公式可以在不同的上下文中计算,具体取决于其他设计元素:

  • 数据透视表或报表中应用的筛选器
  • 公式中定义的筛选器
  • 在公式中使用特殊函数指定的关系

有不同类型的上下文: 行上下文查询上下文筛选器上下文

行上下文

行上下文 可视为“当前行”。 如果在计算列中创建公式,该公式的行上下文将包含当前行中所有列的值。 如果该表与另一个表相关,则内容还包括与当前行相关的其他表中的所有值。

例如,假设你创建了一个计算列, = [Freight] + [Tax]该列将来自同一表中的两列“货运”和“税务”的值相加。 此公式自动仅从当前行的指定列中获取值。

行上下文还遵循表之间定义的任何关系,包括使用 DAX 公式在计算列中定义的关系,以确定相关表中的哪些行与当前行相关联。

例如,以下公式使用 RELATED 函数根据订单寄送到的区域从相关表中获取税值。 税值是使用当前表中区域的值来确定的,查找相关表中的区域,然后从相关表中获取该区域的税率。

= [Freight] + RELATED('Region'[TaxRate])

此公式从“区域”表中获取当前区域的税率,并将其添加到“货运”列的值。 DAX 在公式中,您无需知道或指定连接表的特定关系。

多行上下文

DAX包括对表进行计算迭代的函数。 这些函数可以有多个当前行,每个行都有其自己的行上下文。 从本质上讲,这些函数允许您创建在内层循环和外层循环上递归执行操作的公式。

例如,假设模型包含 Products 表和 Sales 表。 用户可能想要浏览整个销售表,该表包含涉及多个产品的事务,并在任意一个交易中找到每个产品订购的最大数量。

通过 DAX 生成返回正确值的单个公式,每当用户向表添加数据时,结果都会自动更新。

= MAXX(FILTER(Sales,[ProdKey] = EARLIER([ProdKey])),Sales[OrderQty])

有关此公式的详细示例,请参阅 EARLIER

总之,该 EARLIER 函数从当前操作之前的操作中存储行上下文。 函数随时存储在内存中的两组上下文中:一组上下文表示公式内部循环的当前行,另一组上下文表示公式外部循环的当前行。 DAX 自动在两个循环之间馈送值,以便可以创建复杂的聚合。

查询上下文

查询上下文 是指为公式隐式检索的数据子集。 例如,当用户将度量值或字段放入报表中时,引擎会检查行标题、切片器和报表筛选器以确定上下文。 然后,对模型数据运行必要的查询,以获取正确的数据子集,按照公式进行规定的计算,然后在报表中填入相应的值。

由于上下文根据放置公式的位置而更改,因此公式的结果也可以更改。 例如,假设创建一个公式,用于对 Sales 表的“利润”列中的值求和: = SUM('Sales'[Profit]) 如果在 Sales 表中的计算列中使用此公式,则整个表的结果将相同,因为公式的查询上下文始终是 Sales 表的整个数据集。 结果将对所有区域、所有产品、所有年份等产生利润。

但是,用户通常不希望看到数百次相同的结果,而是希望获得特定年份、特定国家/地区、特定产品或这些条件任意组合下的利润,然后获取总计。

在报表中,通过筛选、添加或删除字段以及使用切片器来更改上下文。 对于每个更改而言,即指将在其中计算度量值的查询上下文。 因此,度量值中使用的相同公式将在每个单元格的不同查询上下文中进行计算

筛选器上下文

筛选器上下文 是每个列或从相关表检索的值中允许的值集。 筛选器可以应用于设计器中的列,也可以应用于呈现层(报表和数据透视表)。 还可以通过公式中的筛选器表达式显式定义筛选器。

通过使用公式的参数对列或表中允许的值集指定筛选约束时,将添加筛选器上下文。 筛选上下文在其他上下文之上应用,例如行上下文或查询上下文。

在表格模型中,有多种方法可以创建筛选器上下文。 在可使用该模型的客户端的上下文(如 Power BI 报表)中,用户可以通过在行标题和列标题上添加切片器或报表筛选器来动态创建筛选器。 还可以直接在公式中指定筛选器表达式、指定相关值、筛选用作输入的表,或动态获取计算中使用的值的上下文。 还可以完全清除或选择性地清除特定列的筛选器。 创建计算总计的公式时,这非常有用。

若要详细了解如何在公式中创建筛选器,请参阅 FILTER Function (DAX) 。 有关如何清除筛选器以创建总计的示例,请参阅 ALL 函数 (DAX)

有关如何在公式中选择性地清除和应用筛选器的示例,请参阅 ALLEXCEPT

确定公式中的上下文

创建 DAX 公式时,首先测试公式是否具有有效的语法,然后进行测试以确保公式中包含的列和表的名称可以在当前上下文中找到。 如果找不到公式指定的任何列或表,则返回错误。

在验证(和重新计算操作)期间,使用模型中的可用表、表之间的关系以及已应用的筛选器来确定上下文,如前面部分所述。

例如,如果刚刚将某些数据导入到新表中,并且它与任何其他表无关(并且未应用任何筛选器), 则当前上下文 是表中的整个列集。 如果表由与其他表的关系链接,则当前上下文包括相关表。 如果将表中的列添加到具有切片器和可能具有一些报表筛选器的报表中,则公式的上下文是报表的每个单元格中的数据子集。

上下文是一个强大的概念,也使得难以对公式进行故障排除。 建议从简单的公式和关系开始,了解上下文的工作原理。 以下部分提供了公式如何使用不同类型的上下文动态返回结果的一些示例。

运营商

该 DAX 语言在公式中使用四种不同类型的计算运算符:

  • 用于比较值并返回逻辑TRUE`FALSE`值的比较运算符。
  • 算术运算符用于执行算术计算,并返回数值。
  • 用于联接两个或多个文本字符串的文本串联运算符。
  • 将两个或多个表达式组合在一起以返回单个结果的逻辑运算符。

有关公式中使用的 DAX 运算符的详细信息,请参阅 DAX 运算符

处理表和列

表格数据模型中的表类似于 Excel 表,但它们处理数据和公式的方式不同:

  • 公式仅适用于表和列,而不适用于单个单元格、区域引用或数组。
  • 公式可以使用关系从相关表中获取值。 检索的值始终与当前行值相关。
  • 无法像在 Excel 工作表中一样使用不规则或“不齐整”的数据。 表中的每一行必须包含相同数量的列。 但是,某些列中可以有空值。 Excel 数据表和表格模型数据表不可互换。
  • 由于为每个列设置了数据类型,因此该列中的每一个值必须具有相同的类型。

在公式中引用表和列

可以使用其名称引用任何表和列。 例如,下面的公式说明了如何使用完全限定的名称引用两个表中的列


= SUM('New Sales'[Amount]) + SUM('Past Sales'[Amount])

在计算公式时,模型设计器首先检查一般语法,然后将您提供的列和表的名称与当前上下文中可能存在的列和表进行检查。 如果名称不明确或找不到列或表,则公式上会出现错误(#ERROR 字符串而不是发生错误的单元格中的数据值)。 若要详细了解表、列和其他对象的命名要求,请参阅语法中的DAX命名要求。

表关系

创建表之间的关系,使得可以在计算中使用其他表的相关值。 例如,可以使用计算列来确定与当前经销商相关的所有发货记录,然后为每个经销商计算发货成本。 但是,在许多情况下,可能不需要关系。 可以在公式中使用LOOKUPVALUE函数返回符合search_columnsearch_value参数条件的行中的result_columnName的值。

许多 DAX 函数要求表或多个表之间存在关系,以便找到引用的列并返回有意义的结果。 其他函数将尝试标识关系;但是,为了获得最佳效果,应始终尽可能创建关系。 表格数据模型支持多张表之间的多重关系。 为了避免混淆或不正确的结果,一次只有一个关系被指定为活动关系,但你可以根据需要更改活动关系,以在计算中遍历数据中的不同连接。 USERELATIONSHIP 函数可用于指定要在特定计算中使用的一个或多个关系。

使用关系时,请务必遵守这些公式设计规则:

  • 当表通过关系连接时,必须确保用作键的两列具有匹配的值。 不强制实施引用完整性,因此可以在键列中具有非匹配值,但仍创建关系。 如果发生这种情况,应注意空白值或非匹配值可能会影响公式的结果。

  • 使用关系在模型中链接表时,扩大了在其中计算公式的范围或上下文。 因添加新表、新关系或活动关系更改而导致上下文中的更改可能会导致结果以你可能无法预料的方式更改。 若要了解详细信息,请参阅本文中的 上下文

处理和刷新

进程重新计算 是两个单独的但相关的作。 设计包含复杂公式、大量数据或从外部数据源获取的数据的模型时,应全面了解这些概念。

进程(刷新) 使用外部数据源中的新数据更新模型中的数据。

重新计算 是更新公式结果的过程,以反映对公式本身所做的任何更改,并反映基础数据中的更改。 重新计算可通过以下方式影响性能:

  • 计算列中的值将计算并存储在模型中。 若要更新计算列中的值,必须使用三个处理命令之一(进程完整、处理数据或进程重新计算)来处理模型。 每当更改公式时,必须始终为整个列重新计算公式的结果。

  • 每当用户将度量值添加到数据透视表或打开报表时,都会动态计算度量值:当用户修改上下文时,度量值更改返回的值。 度量值的结果始终反映内存中缓存中的最新结果。

处理和重新计算对行级别安全性公式没有影响,除非重新计算的结果返回不同的值,从而确定行是否可由角色成员查询。

更新

DAX 处于持续改进中。 新的和更新的函数 随下一个可用更新一起发布,通常每月发布。 首先更新服务,然后更新已安装的应用程序,例如 Power BI Desktop、Excel、SQL Server Management Studio(SSMS)和用于 Visual Studio 的 Analysis Services 项目扩展(SSDT)。 SQL Server Analysis Services 随下一次累积更新一起更新。 新功能会先在功能参考DAX中宣布和描述,以配合Power BI Desktop的更新。

并非所有函数在早期版本的 SQL Server Analysis Services 和 Excel 中都受支持。

故障排除

如果在定义公式时收到错误,公式可能包含 语法错误语义错误计算错误

语法错误是最容易解决的。 它们通常涉及缺失的括号或逗号。

语法虽然正确,但在公式的上下文中引用的值或列可能不合理,因此会发生另一种类型的错误。 此类语义和计算错误可能是由以下任何问题引起的:

  • 公式引用非现有列、表或函数。
  • 公式看起来正确,但当数据引擎提取数据时,它会发现类型不匹配并引发错误。
  • 公式将不正确的数字或参数类型传递给函数。
  • 公式引用了具有错误的其他列,因此其值无效。
  • 公式是指尚未处理的列,这意味着它具有元数据,但没有用于计算的实际数据。

在前四种情况下, DAX 标记包含无效公式的整个列。 在最后一种情况下, DAX 将列灰显,以指示该列处于未处理状态。

应用和工具

Power BI Desktop

Power BI Desktop

Power BI Desktop 是一个免费的数据建模和报告应用程序。 模型设计器包括用于创建 DAX 计算公式的 DAX 编辑器。

Excel 中的 Power Pivot

Excel 中的 Power Pivot

Excel 模型设计器 中的 Power Pivot 包含用于 DAX 创建 DAX 计算公式的编辑器。

Visual Studio

Visual Studio

包含 Analysis Services 项目扩展 (VSIX) 的 Visual Studio 用于创建 Analysis Services 模型项目。 项目扩展中安装的表格模型设计器包括一个 DAX 编辑器。

SQL Server Management Studio

SQL Server Management Studio

SQL Server Management Studio (SSMS)是使用 Analysis Services 的基本工具。 SSMS 包括用于 DAX 查询表格模型和多维模型的查询编辑器。

DAX Studio

DAX 工作室图标

DAX Studio 是一种开源客户端工具,用于在 Excel 模型中针对 Analysis Services、Power BI Desktop 和 Power Pivot 创建和运行 DAX 查询。

表格编辑器

表格编辑器图标

表格编辑器 是一个开源工具,提供表格模型元数据中每个对象的直观分层视图。 表格编辑器包含一个具有语法高亮功能的DAX编辑器,它提供了一种简单的方法来编辑度量值、计算列和计算表表达式。

学习资源

学习 DAX时,最好使用要用于创建数据模型的应用程序。 Excel 中的 Analysis Services、Power BI Desktop 和 Power Pivot 都有文章和教程,其中包括使用 DAX 创建度量值、计算列和行筛选器的课程。 下面是一些其他资源:

Videos

在 Power BI Desktop 学习路径中使用DAX

Alberto Ferrari 和 Marco Russo 合著的 DAX 权威指南(Microsoft 出版社)。 现在,在第二版中,本广泛的指南为入门数据建模者和 BI 专业人员提供了创新高性能技术的基本知识。

图书图片的终极指南DAX

社区

DAX 有一个充满活力的社区总是愿意分享他们的专业知识。 Microsoft Power BI 社区有一个专门讨论论坛,DAXDAX仅适用于命令和提示