针对 PowerPivot 的 DAX 运算符参考
数据分析表达式 (DAX) 语言使用运算符来创建表达式,用以比较值、执行算术计算或处理字符串。 本节介绍了每种运算符的用法。
运算符的类型
有四种不同类型的运算符:算术运算符、比较运算符、文本串联运算符和逻辑运算符。
算术运算符
若要执行基本的数学运算(例如加法、减法或乘法)、组合数字以及生成数值结果,请使用以下算术运算符:
算术运算符 |
含义 |
示例 |
---|---|---|
+(加号) |
加 |
3+3 |
-(减号) |
减或符号 |
3–1–1 |
*(星号) |
乘 |
3*3 |
/(正斜杠) |
除 |
3/3 |
^(插入号) |
求幂 |
16^4 |
注意 |
---|
加号既可以作为“二元运算符”,也可以作为“一元运算符”。 作为二元运算符时,该运算符要求两端都有数字,并执行加法运算。 当在 DAX 公式中的二元运算符两端使用值时,如果这些值不是数字,DAX 会尝试将其转换为数值数据类型。 相比之下,一元运算符则可以应用于任何类型的参数。 加号不影响类型或值,只会被忽略,而减号运算符在应用于数值时会创建符号相反的值。 |
比较运算符
可以使用以下运算符对两个值进行比较。 在使用这些运算符对两个值进行比较时,结果将为逻辑值 True 或 False。
比较运算符 |
含义 |
示例 |
---|---|---|
= |
等于 |
[Region] = "USA" |
> |
大于 |
[Sales Date] > "Jan 2009" |
< |
小于 |
[Sales Date] < "Jan 1 2009" |
>= |
大于或等于 |
[Amount] >= 20000 |
<= |
小于或等于 |
[Amount] <= 100 |
<> |
不等于 |
[Region] <> "USA" |
文本串联运算符
使用与号 (&) 可以联接或串联两个或更多文本字符串以生成单个文本。
文本运算符 |
含义 |
示例 |
---|---|---|
&(与号) |
连接(或串联)两个值以生成一个连续的文本值 |
[Region] & ", " & [City] |
逻辑运算符
使用逻辑运算符 (&&) 和 (||) 可组合表达式以生成单个结果。
文本运算符 |
含义 |
示例 |
---|---|---|
&&(双与号) |
在两个都计算为布尔结果的表达式之间创建“与”条件。 如果两个表达式都返回 TRUE,则这两个表达式的组合也返回 TRUE;否则该组合返回 FALSE。 |
([Region] = "France") && ([BikeBuyer] = "yes")) |
||(双竖线符号) |
在两个逻辑表达式之间创建“或”条件。 如果任一表达式返回 TRUE,则结果为 TRUE;仅当两个表达式均为 FALSE 时,结果才为 FALSE。 |
(([Region] = "France") || ([BikeBuyer] = "yes")) |
运算符和优先级顺序
在某些情况下,执行计算的顺序可能会影响返回值;因此,务必要了解如何确定顺序以及如何更改顺序来获得所需的结果。
计算顺序
表达式按特定顺序计算运算符和值。 所有表达式都以等号 (=) 开始。 等号指示后续字符构成一个表达式。
等号之后是要计算的元素(操作数),由计算运算符分隔。 表达式始终从左向右读取,但是可以使用括号对元素进行分组,从而在一定程度上控制元素的计算顺序。
运算符优先级
如果在一个公式中合用了多个运算符,则按下表中的顺序执行运算。 如果多个运算符具有相同的优先级值,则按从左到右的顺序执行运算。 例如,如果某个表达式中同时包含一个乘法运算符和一个除法运算符,则这两个运算符按照在该表达式中出现的顺序,即从左到右进行计算。
运算符 |
说明 |
---|---|
^ |
求幂 |
– |
符号(如在 –1 中) |
* 和 / |
乘法和除法 |
! |
NOT(一元运算符) |
+ 和 – |
加法和减法 |
& |
连接两个文本字符串(串联) |
=< ><=>=<> |
比较 |
用括号控制计算顺序
若要更改计算顺序,您应将必须先计算的公式部分括在括号内。 例如,下面的公式计算结果为 11,因为乘法先于加法进行计算。 该公式将 2 与 3 相乘,然后将乘积与 5 相加。
=5+2*3
相比之下,如果使用括号更改该语法,将顺序更改为将 5 与 2 相加,然后将结果乘以 3,从而得到 21。
=(5+2)*3
在下面的示例中,公式第一部分两旁的括号强制先计算表达式 (3 + 0.25),然后除以表达式 (3 - 0.25) 的结果。
=(3 + 0.25)/(3 - 0.25)
在下面的示例中,根据运算符的优先顺序规则,首先应用求幂运算符,然后应用符号运算符。 该表达式的结果是 -4。
=-2^2
为了确保符号运算符首先应用于数值,您可以使用括号来控制运算符,如下面的示例中所示。 该表达式的结果是 4。
= (-2)^2
兼容性说明
DAX 可轻松处理和比较各种数据类型,其方式与 Microsoft Excel 十分相似。 然而,其基础计算引擎基于 SQL Server Analysis Services,并新增了关系数据存储的一些高级功能,包括更加丰富的日期和时间类型支持。 因此,计算结果或函数行为在某些情况下可能与 Excel 不同。 此外,DAX 比 Excel 支持的数据类型要多。 本节介绍一些主要差异。
强制操作数的数据类型
一般而言,任何运算符左右两侧的两个操作数都应具有相同的数据类型。 然而,如果数据类型不同,DAX 会将其转换为通用数据类型以进行比较,过程如下:
首先,将两个操作数都转换为最可能的通用数据类型。
然后,对这两个操作数进行比较。
例如,假定您要组合两个数字。 一个数字为某个公式(如 =[Price] * .20)的计算结果,其中可能包含许多小数位。 另一个数字是作为字符串值提供的整数。
在这种情况下,DAX 将使用可以存储两种类型数字的最大数值格式将两个数字都转换为数值格式的实数。 然后,DAX 将比较这两个值。
相比之下,Excel 将尝试直接比较不同类型的值,而不是先将它们强制为通用类型。 因此,对于同一比较表达式,DAX 中的结果可能与 Excel 中不同。
DAX 中使用的数据类型 |
Excel 中使用的数据类型 |
---|---|
Numbers (I8, R8) Boolean String DateTime Currency |
Numbers (R8) Boolean String Variant Currency |
有关隐式数据类型转换的详细信息,请参阅PowerPivot 工作簿中支持的数据类型。
优先级顺序的差异
DAX 公式中的运算优先级顺序与 Microsoft Excel 采用的顺序基本相同,但 DAX 公式中不支持某些 Excel 运算符(如百分号运算符)。 此外,也不支持范围。
因此,每当从 Excel 复制并粘帖公式时,请务必仔细检查公式,因为公式中的某些运算符或元素可能无效。 如果对运算执行顺序有任何疑问,我们建议您使用括号控制运算顺序,以避免结果的不明确性。