活动
DAX 概述
数据分析表达式 (DAX) 是在 Analysis Services、Power BI 以及 Excel 中的 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 度量值放入报表中,然后将“产品”表中的“产品类别”列放入筛选器中时,将计算并显示每个产品类别的“销售额”总和。
与计算列不同,度量值的语法包括公式前面的度量值名称。 在刚才提供的示例中,名称 Total Sales 出现在公式之前。 创建度量值后,名称及其定义将显示在报表客户端应用程序字段列表中,并且根据透视和角色,可供模型的所有用户使用。
若要了解更多信息,请参阅以下文章:
Power BI Desktop 中的度量值
Analysis Services 中的度量值
Power Pivot 中的度量值
计算列是这样的列:在模型设计器中添加到现有表,然后用于创建定义列值的 DAX 公式。 当计算列包含有效的 DAX 公式时,输入公式后就会立即为每行计算值。 然后,将值存储在内存中数据模型中。 例如,在“日期”表中,在公式栏中输入公式后:
= [Calendar Year] & " Q" & [Calendar Quarter]
表中每行的值是通过从(同一个“日期”表中的)“日历年”列获取值来计算的,添加一个空格和大写字母 Q,然后添加(同一个“日期”表中的)“日历季度”列的值。 然后就会立即计算并显示计算列中每行的结果,例如 2017 Q1 。 仅当处理(刷新)表或任何相关表,或从内存中卸载模型然后重新加载时(如关闭和重新打开 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 中的角色
可以在 SQL Server Management Studio (SSMS) 和 DAX Studio (daxstudio.org) 等开放源代码工具中创建和运行 DAX 查询。 不同于 DAX 计算公式只能在表格数据模型中创建,DAX 查询也可以针对 Analysis Services 多维模型运行。 与多维数据表达式 (MDX) 查询相比,DAX 查询通常更易于编写,而且效率更高。
DAX 查询是一个语句,类似于 T-SQL 中的 SELECT 语句。 DAX 查询的最基本类型是计算语句 。 例如,
EVALUATE
( FILTER ( 'DimProduct', [SafetyStockLevel] < 200 ) )
ORDER BY [EnglishProductName] ASC
在结果中返回一个表,该表仅列出 SafetyStockLevel 小于 200 的产品,按 EnglishProductName 升序排序。
可以创建度量值作为查询的一部分。 度量值仅在查询期间存在。 要了解详细信息,请参阅 DAX 查询。
DAX 公式对于在计算列和度量值中创建计算以及使用行级别安全性保护数据方面非常重要。 要为计算列和度量值创建公式,请使用模型设计器窗口顶部的公式栏或 DAX 编辑器。 要为行级别安全性创建公式,请使用“角色管理器”或“管理角色”对话框。 本部分中的信息旨在帮助你开始了解 DAX 公式的基础知识。
DAX 公式可以很简单,也可以非常复杂。 下表显示了一些可以在计算列中使用的简单公式示例。
Formula | 定义 |
---|---|
= TODAY() |
在计算列的每一行中插入今天的日期。 |
= 3 |
在计算列的每一行中插入值 3。 |
= [Column1] + [Column2] |
将 [Column1] 和 [Column2] 的同一行中的值相加,并将结果放置在同一行的计算列中。 |
无论所创建的公式是简单的还是复杂的,都可以按照以下步骤生成公式:
每个公式必须以等号 (=) 开头。
可以键入或选择一个函数名称,也可以键入一个表达式。
开始键入所需函数或名称的前几个字母,自动完成功能将显示可用函数、表和列的列表。 按 Tab 键将自动完成列表中的项添加到公式中。
还可以单击 Fx 按钮显示可用函数的列表 。 要从下拉列表中选择一个函数,请使用箭头键突出显示该项,然后单击“确定”将该函数添加到公式中 。
通过从可能的表和列下拉列表中选择参数,或者通过键入值,为函数提供参数。
检查语法错误:确保所有括号都成对,并且正确引用了列、表和值。
按 Enter 键接受该公式。
备注
在计算列中,只要输入公式并验证公式,列就会填充值。 在度量值中,按 Enter 键会将度量值定义与表一起保存。 如果公式无效,将显示错误。
在本示例中,我们来看看名为“Days in Current Quarter”的度量值中的公式 :
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 计算“日期”表中的行数 |
() |
左右括号指定参数。 |
DATESBETWEEN |
DATESBETWEEN 函数返回“日期”表“日期”列中每个值的最后日期之间的日期。 |
'Date' |
指定“日期”表。 表用单引号引起来。 |
[Date] |
指定“日期”表中的“日期”列。 列用方括号括起来。 |
, |
|
STARTOFQUARTER |
STARTOFQUARTER 函数返回季度的开始日期。 |
LASTDATE |
LASTDATE 函数返回季度的最后日期。 |
'Date' |
指定“日期”表。 |
[Date] |
指定“日期”表中的“日期”列。 |
, |
|
ENDOFQUARTER |
ENDOFQUARTER 函数 |
'Date' |
指定“日期”表。 |
[Date] |
指定“日期”表中的“日期”列。 |
记忆式键入功能通过为您提供公式中每个元素的选项,可帮助您输入有效的公式语法。
可以在具有嵌套函数的现有公式中使用公式记忆式键入功能。 刚好在插入点之前的文本将用于显示下拉列表中的值,并且插入点之后的所有文本都保持不变。
记忆式键入功能不添加函数的右括号或自动匹配括号。 您必须确保每个函数在语法上都是正确的,否则不能保存或使用公式。
您可以嵌套函数,这意味着您可以使用一个函数的结果作为另一个函数的参数。 在计算列中,最多可以嵌套 64 个级别的函数。 但是,嵌套可能会导致很难创建公式或者排除公式问题。 许多函数设计为仅用作嵌套函数。 这些函数返回一个表,该表不能直接保存为结果,而必须作为表函数的输入提供。 例如,函数 SUMX、AVERAGEX 和 MINX 全都要求将表作为第一个参数。
函数是表达式中的命名公式。 大多数函数都包含必需和可选的实参(亦称为“形参”)作为输入。 函数在执行后返回值。 DAX 包括一些函数,可用于使用日期和时间执行计算、创建条件值、处理字符串、基于关系执行查找以及循环访问表以执行递归计算。 如果您熟悉 Excel 公式,会发现 Excel 公式与 DAX 公式中的多数函数都极为相似;但是,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 中的数据类型 | 描述 |
---|---|---|
整数 | 一个 64 位(八字节)整数值 1、2 | 没有小数位的数字。 整数可以是正数或负数,但必须是介于 -9,223,372,036,854,775,808 (-2^63) 和 9,223,372,036,854,775,807 (2^63-1) 之间的整数。 |
十进制数 | 一个 64 位(八字节)实数 1、2 | 实数是可具有小数位的数字。 实数涵盖很广范围的值: 从 -1.79E +308 到 -2.23E -308 的负值 零 从 2.23E -308 到 1.79E + 308 的正值 但是,有效位数限制为 17 个小数位。 |
布尔 | 布尔 | True 或 False 值。 |
文本 | String | 一个 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 公式时需要了解的重要概念。 您可以通过上下文执行动态分析,因为公式的结果会发生更改以反映当前行或单元选择以及任何相关数据。 了解上下文并有效使用上下文对构建高性能的动态分析和解决公式中的问题至关重要。
可以在不同的上下文中计算表格模型中的公式,这取决于其他设计元素:
- 数据透视表或报表中应用的筛选器
- 公式中定义的筛选器
- 使用公式中的特殊函数指定的关系
有许多类型的上下文:“行上下文” 、“查询上下文” 和“筛选上下文”。
可以将行上下文视为“当前行”。 如果您在计算列中创建某一公式,则该公式的“行上下文”将包括来自当前行中所有列的值。 如果该表与其他表相关,则上下文还包括来自另一个表中与当前行相关的所有值。
例如,假设创建将同一表中的两列(Freight 和 Tax)的值相加的计算列 = [Freight] + [Tax]
。 此公式仅自动获取指定列中当前行的值。
行上下文还会依照已定义的表之间的任何关系(包括使用 DAX 公式在计算列中定义的关系)来确定相关表中与当前行关联的行。
例如,下面的公式使用 RELATED 函数根据订单的发货目的地从相关表提取税金值。 通过使用当前表中的区域值,在相关表中查找该区域,然后从相关表中获取该区域的税率,从而确定税金值。
= [Freight] + RELATED('Region'[TaxRate])
此公式从 Region 表中获取当前区域的税率,并将其与 Freight 列中的值相加。 在 DAX 公式中,您无需了解或指定连接各表的特定关系。
DAX 包括对表执行迭代计算的函数。 这些函数可以具有多个当前行,其中每个行都有自己的行上下文。 实际上,可以利用这些函数创建用于以递归方式对内部和外部循环进行操作的公式。
例如,假设您的模型包含一个 Products 表和一个 Sales 表。 用户可能想要遍历整个 Sales 表,该表中全都是涉及多个产品的交易,并且您还要找到在任何一个交易中为每个产品订购的最大数量。
使用 DAX,您可以生成返回正确值的单个公式,并且只要用户向表中添加数据,结果就自动更新。
= MAXX(FILTER(Sales,[ProdKey] = EARLIER([ProdKey])),Sales[OrderQty])
有关此公式的详细示例,请参阅 EARLIER。
总之,该 EARLIER 函数存储来自当前运算之前的运算中的行上下文。 在任何时候,该函数都在内存中存储两组上下文:一组上下文表示公式的内部循环的当前行,另一组上下文表示公式的外部循环的当前行。 DAX 自动在两个循环之间馈送值,以便您可以创建复杂的聚合。
“查询上下文”是指为公式隐式检索的数据子集。 例如,当用户将度量值或字段放入报表时,引擎将检查行标题、列标题、切片器和报表筛选器,以确定上下文。 然后,对模型数据运行必要的查询以获取正确的数据子集,进行公式定义的计算,接着在报表中填充值。
由于上下文会根据放置公式的位置而更改,因此公式的结果也会更改。 例如,假设你创建一个对“销售”表“利润”列中的值求和的公式:= SUM('Sales'[Profit])
。 如果在“销售”表中的计算列中使用此公式,则该公式的结果对于整个表将是相同的,因为公式的查询上下文始终是“销售”表的整个数据集 。 结果将包含所有区域、所有产品、所有年份等的利润。
但是,用户通常不希望看到数百次相同的结果,而是希望获得特定年份、特定国家/地区、特定产品或这些条件任意组合下的利润,然后获取总计。
在报表中,通过筛选、添加或删除字段以及使用切片器来更改上下文。 对于每个更改,为将在其中计算度量值的查询上下文。 因此,对于每个单元,在不同的“查询上下文”中计算在度量值中使用的相同公式。
“筛选上下文”是指每个列中允许存在的一组值,或可属于从相关表中检索到的值的一组值。 可以对设计器或表示层(报表和数据透视表)中的列应用筛选器。 也可以通过公式中的筛选表达式来显式定义筛选器。
通过在公式中使用参数,为列或表中允许存在的值集指定筛选约束时,将添加“筛选上下文”。 基于其他上下文(如行上下文或查询上下文)应用筛选上下文。
在表格模型中,可通过多种方式来创建筛选上下文。 在可使用该模型的客户端的上下文(如 Power BI 报表)中,用户可以通过在行标题和列标题上添加切片器或报表筛选器来动态创建筛选器。 还可以在公式中直接指定筛选表达式来执行以下操作:指定相关的值、筛选用作输入的表或动态获取计算中使用的值的上下文。 您还可以完全清除或有选择地清除特定列上的筛选器。 这在创建用于计算总计的公式时很有用。
要详细了解如何在公式中创建筛选器,请参阅 FILTER 函数 (DAX)。
有关如何清除筛选器以便创建总计的示例,请参阅 ALL 函数 (DAX)。
有关如何在公式中选择性地清除和应用筛选器的示例,请参阅 ALLEXCEPT。
在创建一个 DAX 公式时,首先会测试该公式的语法是否有效,然后测试该公式以确保其包含的列和表的名称位于当前上下文中。 如果找不到该公式指定的任一列或表,则将返回错误。
如前所述,通过使用模型中的可用表、表之间的所有关系和所应用的所有筛选器来确定验证(和重新计算操作)期间的上下文。
例如,如果刚刚将一些数据导入到一个新表中,而该表未与任何其他表关联(并且尚未应用任何筛选器),则当前上下文是表中的完整列集。 如果通过关系将该表与其他表链接,则当前上下文将包括相关的表。 如果将该表中的某个列添加到一个报表中,该报表具有切片器并且可能具有一些报表筛选器,则公式的上下文是报表的每个单元中的数据子集。
上下文是一个很有用的概念,但也可能导致很难排除公式问题。 我们建议您从简单的公式和关系入手,了解上下文的工作原理。 下一节提供了一些示例,说明公式如何使用不同类型的上下文来动态返回结果。
DAX 语言在公式中使用四种不同类型的运算符:
- 对值进行比较,并返回一个逻辑 TRUE\FALSE 值的比较运算符。
- 执行返回数值的算术运算的算术运算符。
- 联接两个或更多文本字符串的文本连接运算符。
- 将两个或更多表达式组合起来以返回单个结果的逻辑运算符。
要详细了解 DAX 公式中使用的运算符,请参阅 DAX 运算符。
表格数据模型中的表与 Excel 表类似,但在处理数据和公式的方式上有所不同:
- 公式只使用表和列,而不使用各个单元格、范围引用或数组。
- 公式可以使用关系从相关表中获取值。 检索到的值始终与当前行值相关。
- 您不能像在 Excel 工作表中一样使用不规则或“不齐整”的数据。 表中每行所包含的列数必须相同。 然而,一些列中可以包含空值。 Excel 数据表和表格模型数据表不能互换。
- 由于为每列都设置了数据类型,该列中的每个值必须同属一种类型。
可以通过名称来引用任何表和列。 例如,下面的公式说明如何通过使用“完全限定”的名称来引用两个表中的列:
= SUM('New Sales'[Amount]) + SUM('Past Sales'[Amount])
计算公式时,模型设计器首先检查常规语法,然后根据当前上下文中的可能列和表检查所提供的列和表的名称。 如果名称不明确或者列或表无法找到,则您将收到有关公式的错误(在发生错误的单元格中,用 #ERROR 字符串代替数据值)。 要详细了解表、列和其他对象的命名要求,请参阅 DAX 语法中的命名要求。
通过在表之间创建关系,可以在计算中使用其他表中的相关值。 例如,可以使用计算列来确定与当前经销商相关的所有装运记录,然后对每个记录的装运成本求和。 但在许多情况下,关系可能没有必要。 可以在公式中使用 LOOKUPVALUE 函数,以在 result_columnName 中返回符合 search_column 和 search_value 参数中指定条件的行的值。
很多 DAX 函数都要求两个表或多个表之间存在关系,以便定位所引用的列并返回有意义的结果。 其他函数将尝试确定关系;但是,为获得最佳结果,您始终应尽量创建关系。 表格数据模型支持表之间的多个关系。 为避免混淆或不正确的结果,一次只将一个关系指定为活跃关系,但可以根据需要更改活跃关系以便在计算中遍历数据中的不同连接。 可使用 USERELATIONSHIP 函数指定一个或多个要在特定计算中使用的关系。
使用关系时,必须遵守以下公式设计规则:
当表通过关系进行连接时,必须确保用作键的两列具有匹配的值。 不会强制实施引用完整性,因此可以在键列中具有不匹配的值并仍创建关系。 如果发生这种情况,您应注意空值或不匹配值可能会影响公式的结果。
使用关系在模型中链接表时,可以扩大公式的计算范围(或“上下文”)。 因添加新表、新关系或因活动关系改变而引起的上下文变化可能会导致结果发生意外变化。 有关详细信息,请参阅本文中的上下文。
处理和重新计算是两个独立但相关的运算。 在设计包含复杂公式、大量数据或从外部数据源获取的数据的模型时,应充分了解这些概念。
处理(刷新)使用外部数据源中的新数据更新模型中的数据。
“重新计算”是对公式结果进行更新的过程,用于反映对公式本身的任何更改以及基础数据中的更改。 重新计算会以下列方式影响性能:
对计算列中的值进行计算并存储在模型中。 若要更新计算列中的值,必须使用以下三个处理命令之一处理该模型 —“处理全部”、“处理数据”或“处理重新计算”。 每当您更改公式时,必须始终针对整个列重新计算公式的结果。
每当用户向数据透视表添加度量值或打开报表时,都会动态计算度量值计算的值;当用户修改上下文时,度量值返回的值将更改。 度量值的结果将始终反映内存中缓存中的最新内容。
处理和重新计算对行级别安全性公式没有影响,除非重新计算的结果返回不同的值,从而确定行是否可由角色成员查询。
DAX 处于持续改进中。 新函数和已更新的函数随下一次发布更新一起发布,通常每月一次。 首先更新服务,然后更新已安装的应用程序,如 Power BI Desktop、Excel、SQL Server Management Studio (SSMS) 和 Visual Studio Analysis Services 项目扩展 (SSDT)。 SQL Server Analysis Services 随下一次累积更新一起更新。 与 Power BI Desktop 更新一致,新函数将首先在 DAX 函数引用中进行公布和说明。
并非所有函数都在早期版本的 SQL Server Analysis Services 和 Excel 中受支持。
如果在定义公式时遇到错误,公式可能会包含“语法错误” 、“语义错误” 或“计算错误”。
语法错误最容易解决。 它们通常涉及缺少括号或逗号。
当语法正确,但引用的值或列在公式的上下文中没有意义时,会发生另一种类型的错误。 此类语义和计算错误可能是由于下列任何问题导致的:
- 公式中引用不存在的列、表或函数。
- 公式似乎正确,但在数据引擎提取数据时,它会发现类型不匹配,并引发错误。
- 公式将数量或类型不正确的参数传递给函数。
- 公式中引用有错误的其他列,因此它的值无效。
- 公式会引用尚未处理的列,这意味着,它有元数据,但没有用于计算的实际数据。
在前四种情况中,DAX 标记包含无效公式的整个列。 在最后一种情况中,DAX 会灰显该列,以便指示该列处于未处理的状态中。
Power BI Desktop 是免费的数据建模和报表应用程序。 模型设计器包含用于创建 DAX 计算公式的 DAX 编辑器。
Excel 中的 Power Pivot 模型设计器包含用于创建 DAX 计算公式的 DAX 编辑器。
包含 Analysis Services 项目扩展 (VSIX) 的 Visual Studio 用于创建 Analysis Services 模型项目。 随项目扩展一起安装的表格模型设计器包括一个 DAX 编辑器。
SQL Server Management Studio (SSMS) 是用于处理 Analysis Services 的基本工具。 SSMS 包含用于查询表格和多维模型的 DAX 查询编辑器。
DAX Studio 是一种开放源代码客户端工具,用于针对 Analysis Services、Power BI Desktop 以及 Excel 模型中的 Power Pivot 创建和运行 DAX 查询。
表格编辑器是一种开放源代码工具,用于为表格模型元数据中的每个对象提供直观的层次结构视图。 表格编辑器包括突出显示语法的 DAX 编辑器,通过该编辑器可以轻松地编辑度量值、计算列和计算表表达式。
在学习 DAX 时,最好使用将用于创建数据模型的应用程序。 Analysis Services、Power BI Desktop 和 Excel 中的 Power Pivot 都有相关文章和教程,其中包括介绍如何使用 DAX 创建度量值、计算列和行筛选器的课程。 下面是一些其他资源:
在 Power BI Desktop 中使用 DAX 学习路径。
Alberto Ferrari 和 Marco Russo 合著的 DAX 权威指南(Microsoft 出版社)。 在第二个版本中,现在此扩展指南为数据建模新手和 BI 专业人员提供了创新性的高性能技术基础知识。
DAX 的社区充满活力,始终愿意分享他们的专业知识。 Microsoft Power BI 社区 有一个专门针对 DAX 的特殊讨论论坛,即 DAX 命令和提示。
其他资源
培训
模块
向 Power BI Desktop 模型中添加计算表和计算列 - Training
学习完本模块后,你将能够向语义模型中添加计算表和计算列。 你还能够说明用于对计算列公式进行计算的行上下文。 由于可以使用 Power Query 向表中添加列,因此你还会了解什么时候最好创建计算列而不是 Power Query 自定义列。