了解表格模型中的 DAX (SSAS 表格)

数据分析表达式(DAX)是用于在 PowerPivot 中创建自定义计算的公式语言,用于Microsoft Excel 工作簿和 Analysis Services 表格模型项目。 DAX 公式包括函数、运算符和值,用于对表和列中的数据执行高级计算。

虽然 DAX 适用于 PowerPivot 工作簿和表格模型项目,但本主题更适用于在 SQL Server Data Tools(SSDT)中创作的表格模型项目。 在阅读本主题之前,你应该对 SQL Server Data Tools (SSDT)中的表格模型和表格模型项目创作环境有很好的了解。

本主题中的部分:

表格模型中的 DAX

在 PowerPivot 和表格模型中,在功能上,DAX 公式如何从各自的数据集计算值没有任何区别。 但是,创作 DAX 公式的工作簿和模型编制工具在位置上有所不同,同时在某些度量标准中评估上下文的位置也有所不同。

在 PowerPivot 中,计算公式通常是由工作簿用户为自助服务商业智能分析创建的。 计算列是在 PowerPivot 窗口中为表创建的,度量值是在数据透视表或计算区域中创建的。 与表格模型项目不同,PowerPivot 工作簿不提供基于角色的安全性,后者可以使用 DAX 公式来保护数据。

在表格模型项目中,计算公式由模型作者在 SQL Server Data Tools(SSDT)的模型设计器中创建。 虽然使用 DAX 公式计算的计算列的值立即显示在模型设计器的表中,但度量值网格中的度量值预览功能除外,除非用户在报表客户端(如 Power View 或 Microsoft Excel 中的数据透视表中)指定筛选器,否则不会计算度量值。

如果通过‘从 PowerPivot 导入’项目模板将 PowerPivot 工作簿导入新的表格模型中,则计算列的 DAX 公式就会自动在新表格模型中创建。 工作簿中隐式和显式度量值的 DAX 公式将自动在新表格模型中创建为显式度量值。 由于 PowerPivot 工作簿中尚不存在角色和安全行筛选器功能,因此需要在新的表格模型中至少创建一个角色,以提供对角色成员的模型数据访问权限。 仅当希望在行级别保护表数据时,才需要行筛选器中的 DAX 公式。

计算列、度量值和行筛选器中的 DAX 公式

对于在 SQL Server Data Tools(SSDT)中创建的表格模型,DAX 公式用于计算列、度量值和行筛选器。

计算列

计算列是在模型设计器中添加到现有表的一列,通过创建 DAX 公式来定义该列的值。 通过公式栏为模型设计器中的计算列创建公式。

注释

使用 DirectQuery 模式从关系数据源检索数据的模型不支持计算列。

当计算列包含有效的 DAX 公式时,只要输入公式,就会为每个行计算值。 然后,值存储在数据库中。 例如,在日期表中,当公式输入到公式栏中时,通过从“日历年”列(在同一日期表中)获取值,添加一个空格和大写字母Q,然后再从“日历季度”列(在同一日期表中)添加值,以计算表中每一行的值。 计算列中每一行的结果将立即计算并显示,例如,如 2010 年第 1 季度。 仅当重新处理数据时,才会重新计算列值。

有关详细信息,请参阅计算列(SSAS 表格)。

措施

度量值是动态公式,其中结果会根据上下文而更改。 度量值用于报表格式,这些格式支持使用多个属性(例如 Power View 报表、Excel 数据透视表或数据透视图)合并和筛选模型数据。 在表格模型项目中,度量值由模型作者在 SQL Server Data Tools(SSDT)的模型设计器中使用度量值网格(和公式栏)定义。

度量值中的公式可以使用自动求和功能(如 COUNT 或 SUM)自动创建的标准聚合函数,也可以使用 DAX 定义自己的公式。 在公式栏中为度量值定义公式时,工具提示功能会显示当前上下文中合计结果的预览,否则不会立即将结果输出到任何位置。 其他度量值详细信息也会显示在 “属性 ”窗格中。

无法立即看到(筛选)计算结果的原因是,在没有上下文的情况下无法确定度量值的结果。 若要计算度量值,需要一个报告客户端应用程序,该应用程序可以提供检索与每个单元格相关的数据的上下文,然后计算每个单元格的表达式。 该客户端可能是 Excel 数据透视表或数据透视图、Power View 报表或 MDX 查询。 无论报告客户端如何,都会针对结果中的每个单元格运行单独的查询。 也就是说,数据透视表中的行标题和列标题的每个组合,或 Power View 报表中的切片器和筛选器的每个选择都会生成一个不同的数据子集,用于计算度量值。 例如,在公式Total Sales:=SUM([Sales Amount])的度量中,当用户将“总销售额”度量值放入数据透视表中的值窗口,然后将“产品类别”列放入筛选器窗口时,将计算并显示各个产品类别的销售金额总和。

与计算列和行筛选器不同,度量值的语法包括公式前面的度量值名称。 在刚刚提供的示例中,名称 “总销售额:” 显示在公式前面。 创建度量值后,其名称和定义会出现在报告客户端应用程序的字段列表中,并根据透视图和角色向模型的所有用户提供。

有关详细信息,请参阅“度量值”(SSAS 表格)。

行筛选器

行筛选器定义表中哪些行对特定角色的成员可见。 可以使用 DAX 公式为模型中的每个表创建行筛选器。 在 SQL Server Management Studio 中使用角色管理器为特定角色创建行筛选器。 还可以通过在 SQL Server Management Studio 中使用角色属性为已部署的模型定义行筛选器。

在行筛选器中,DAX 公式(必须计算为布尔 TRUE/FALSE 条件)定义该特定角色的成员查询结果可以返回哪些行。 DAX 公式中未包含的行无法返回。 例如,对于销售角色的成员,“客户”表应用以下 DAX 公式,=Customers[Country] = "USA" 销售角色的成员将只能查看美国客户的数据,并且如 SUM 这样的聚合仅针对美国客户返回。

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

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

有关详细信息,请参阅“角色”(SSAS 表格)。

DAX 数据类型

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

表格模型和 DAX 支持以下数据类型:

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

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



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

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

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

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

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

有关表格模型中的数据类型以及 DAX 中数据类型的显式和隐式转换的详细信息,请参阅支持的数据类型(SSAS 表格)。

DAX 运算符

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

  • 用于比较值的比较运算符并返回逻辑 TRUE\FALSE 值。

  • 算术运算符用于执行算术计算,并返回数值。

  • 用于联接两个或多个文本字符串的文本串联运算符。

  • 将两个或多个表达式组合在一起以返回单个结果的逻辑运算符。

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

DAX 公式

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

公式基础知识

DAX 使表格模型作者能够在两个模型表中定义自定义计算,作为计算列的一部分,以及作为与表关联的度量值,但不直接显示在表中。 DAX 还允许模型作者通过创建返回布尔值的计算来保护数据,从而定义关联角色的成员用户可查询特定或相关表中哪些行。

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

公式 DESCRIPTION
=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] 提供当前时间段内已经过的比例。

此公式包含以下元素:

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

使用公式自动完成

模型设计器中的编辑栏和“角色管理器”对话框中的“公式行筛选器”窗口都提供“自动完成”功能。 AutoComplete 通过提供公式中每个元素的选项来帮助输入有效的公式语法。

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

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

在公式中使用多个函数

可以嵌套函数,这意味着将一个函数的结果用作另一个函数的参数。 最多可以在计算列中嵌套 64 个级别的函数。 但是,嵌套可能会导致公式的创建或故障排除更加困难。

许多函数旨在仅用作嵌套函数。 这些函数返回无法直接保存为结果的表;它必须作为表函数的输入提供。 例如,函数 SUMX、AVERAGEX 和 MINX 都需要表作为第一个参数。

注释

某些限制在函数嵌套的度量标准中应用,以确保性能不受列间依赖关系所需的大量计算的影响。

DAX 函数

本部分概述了 DAX 中支持的函数 类型 。 有关详细信息,请参阅 DAX 函数参考

DAX 提供了各种函数,你可以使用日期和时间执行计算、创建条件值、处理字符串、基于关系执行查找,以及循环访问表以执行递归计算的能力。 如果你熟悉 Excel 公式,其中许多函数将非常类似:但是,DAX 公式在以下重要方面有所不同:

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

  • 如果需要逐行自定义计算,DAX 提供了允许将当前行值或相关值用作参数的函数,以执行因上下文而异的计算。 若要了解这些函数的工作原理,请参阅本主题后面的 DAX 公式中的上下文。

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

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

日期和时间函数

DAX 中的日期和时间函数类似于 excel Microsoft 中的日期和时间函数。 但是,DAX 函数基于 Microsoft SQL Server 所使用的datetime数据类型。 有关详细信息,请参阅日期和时间函数(DAX)。

筛选函数

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

信息函数

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

逻辑函数

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

数学函数和三角函数

DAX 中的数学函数与 Excel 数学和三角函数非常相似。 DAX 函数使用的数值数据类型存在一些细微差异。 有关详细信息,请参阅数学和三角函数(DAX)。

统计函数

DAX 提供执行聚合的统计函数。 在 DAX 中,除了可以进行求和和计算平均值、查找最小值和最大值之外,还可以在聚合之前筛选列,或基于相关表创建聚合。 有关详细信息,请参阅统计函数(DAX)。

文本函数

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

时间智能函数

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

Table-Valued 函数

有 DAX 函数可以输出表、将表作为输入,或同时执行这两项作。 由于表可以具有单个列,表值函数也采用单个列作为输入。 了解如何使用这些表值函数对于充分利用 DAX 公式非常重要。 DAX 包括以下类型的表值函数:

筛选器函数 返回与当前行相关的列、表或值。

聚合函数 聚合表行上的任何表达式。

时间智能函数 返回日期表,或使用日期表计算聚合。

DAX 公式中的上下文

上下文 是使用 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 自动在两个循环之间馈送值,以便可以创建复杂的聚合。

查询上下文

查询上下文 是指为公式隐式检索的数据子集。 当用户将度量值或其他值字段置于数据透视表或基于表格模型的报表中时,引擎会检查行标题、切片器和报表筛选器以确定上下文。 然后,对数据源运行必要的查询以获取正确的数据子集,进行公式定义的计算,然后填充数据透视表或报表中的每个单元格。 检索的数据集是每个单元格的查询上下文。

警告

对于 DirectQuery 模式下的模型,首先评估上下文,然后将用于检索正确数据子集并计算结果的集合操作转换为 SQL 语句。 然后,这些语句将直接在关系数据存储中运行。 因此,尽管获取数据和计算结果的方法不同,但上下文本身不会更改。

由于上下文根据放置公式的位置而更改,因此公式的结果也可以更改。

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

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

在数据透视表中,可以通过添加或删除列标题和行标题以及添加或删除切片器来更改上下文。 每当用户向数据透视表添加列或行标题时,他们都会更改计算度量值的查询上下文。 切片和筛选操作也会影响上下文。 因此,度量值中使用的相同公式将在每个单元格的不同查询上下文中进行计算

筛选器上下文

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

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

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

有关如何在公式中创建筛选器的详细信息,请参阅 FILTER 函数

有关如何清除筛选器以创建总计的示例,请参阅 ALL 函数

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

确定公式中的上下文

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

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

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

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

公式中的上下文示例
  1. RELATED 函数扩展当前行的上下文,以在相关列中包括值。 这使得你能够进行查找。 本主题中的示例说明了筛选和行上下文的交互。

  2. FILTER 函数允许指定要包含在当前上下文中的行。 本主题中的示例还说明了如何在执行聚合的其他函数中嵌入筛选器。

  3. ALL 函数设置公式中的上下文。 可以使用它替代由于查询上下文而应用的筛选器。

  4. ALLEXCEPT 函数允许删除除指定筛选器以外的所有筛选器。 这两个主题都包含示例,指导你构建公式和了解复杂上下文。

  5. EARLIER 函数EARLIEST 函数可以在遍历表格时执行计算,同时引用内部循环中的某个值。 如果你熟悉递归的概念以及内循环和外部循环,你将了解 EARLIER 和 EARLIEST 函数提供的功能。 如果不熟悉这些概念,则应仔细按照示例中的步骤作,以了解在计算中使用内部和外部上下文的方式。

公式和表格模型

在 SQL Server Data Tools(SSDT)中,模型设计器是一个区域,可在其中处理多个数据表并连接表格模型中的表。 在此模型中,表由具有公用值(键)的列上的关系联接。 通过表格模型,可以将值链接到其他表中的列,并创建更有趣的计算。 与在关系数据库中一样,可以连接许多级别的相关表,并使用结果中的任何表中的列。

例如,您可以将销售表、产品表和产品类别表链接在一起,用户可以在数据透视表和报表中使用列的各种组合。 相关字段可用于筛选连接的表,或基于子集创建计算。 (如果您不熟悉关系型数据库以及处理表和联接,请参阅关系(SSAS Tabular)。)

表格模型支持表之间的多个关系。 为了避免混淆或错误的结果,一次只有一个关系被指定为活动关系,但你可以根据需要更改活动关系,以在计算中遍历数据中的不同连接。 USERELATIONSHIP 函数(DAX)可用于指定要在特定计算中使用的一个或多个关系。

在表格模型中,应遵守以下公式设计规则:

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

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

使用表和列

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

  • 公式仅适用于表和列,而不适用于单个单元格、区域引用或数组。

  • 公式可以使用关系从相关表中获取值。 检索的值始终与当前行值相关。

  • 无法像在 Excel 工作表中一样使用不规则或“不齐整”的数据。 表中的每一行必须包含相同数量的列。 但是,某些列中可以有空值。 Excel 数据表和表格模型数据表不可互换。

  • 由于为每个列设置了数据类型,因此该列中的每一个值必须具有相同的类型。

引用公式中的表和列

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

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

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

表关系

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

许多 DAX 函数要求表或多个表之间存在关系,以便找到引用的列并返回有意义的结果。 其他函数将尝试标识关系;但是,为了获得最佳效果,应始终尽可能创建关系。 有关详细信息,请参阅本主题前面的 公式和表格模型

更新公式的结果(进程)

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

处理数据 是使用外部数据源中的新数据更新模型中的数据的过程。

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

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

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

处理和重新计算对行筛选器公式没有影响,除非重新计算的结果返回不同的值,从而使行可查询或不可由角色成员查询。

有关详细信息,请参阅“处理数据”(SSAS 表格)。

排查公式中的错误

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

语法错误是最容易解决的。 它们通常涉及缺失的括号或逗号。 有关各个函数语法的帮助,请参阅 DAX 函数参考

如果语法正确,则会发生其他类型的错误,但在公式上下文中引用的值或列没有意义。 此类语义和计算错误可能是由以下任何问题引起的:

  • 公式引用非现有列、表或函数。

  • 公式似乎正确,但当数据引擎获取数据时,发现类型不匹配并引发错误。

  • 公式将不正确的参数数或类型传递给函数。

  • 公式引用了具有错误的其他列,因此其值无效。

  • 公式是指尚未处理的列,这意味着它具有元数据,但没有用于计算的实际数据。

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

其他资源

表格建模(Adventure Works 教程)提供了有关如何创建表格模型(包括计算列、度量值和行筛选器中的许多计算)的分步说明。 对于大多数公式,提供了关于公式用途的说明。

Analysis Services 和 PowerPivot 团队博客提供有关 SQL Server 2014 Analysis Services(SSAS)和 PowerPivot 的信息、提示、新闻和公告。

DAX 资源中心提供 DAX 内部和外部信息,包括由领先的商业智能专业人员提交的众多 DAX 解决方案。

另请参阅

数据分析表达式 (DAX) 参考指南
度量值 (SSAS 表格)
计算列 (SSAS 表格)
角色(SSAS 表格)
KPI (SSAS 表格)
支持的数据源(SSAS 表格)