DAX 运算符
数据分析表达式 (DAX) 语言使用运算符来创建比较值、执行算术计算或处理字符串的表达式。
运算符类型
有四种不同类型的运算符:算术运算符、比较运算符、文本串联运算符和逻辑运算符。
算数运算符
若要执行基本的数学运算(例如加法、减法或乘法)、组合数字和生成数值结果,请使用以下算术运算符。
算数运算符 | 含义 | 示例 |
---|---|---|
+(加号) | 加法 | 3+3 |
–(减号) | 减法或负号 | 3–1–1 |
*(星号) | 乘法 | 3*3 |
/(正斜杠) | 除法 | 3/3 |
^(脱字号) | 求幂 | 16^4 |
注意
加号既可以用作“二元运算符”,也可以用作“一元运算符” 。 二元运算符在运算符的两侧都需要数字,并执行加法。 当你在二元运算符的两侧使用 DAX 公式中的值时,DAX 会尝试将值转换为数值数据类型(如果它们尚不是数字)。 与此相反,一元运算符可以应用于任何类型的参数。 加号不会影响类型或值,可直接忽略,但如果将减号运算符应用于数值,则其会创建一个负值。
比较运算符
可以使用以下运算符将两个值进行比较。 使用这些运算符对两个值进行比较时,结果为逻辑值(TRUE 或 FALSE)。
比较运算符 | 含义 | 示例 |
---|---|---|
= | 等于 | [Region] = "USA" |
== | 严格等于 | [Region] == "USA" |
> | 大于 | [Sales Date] > "Jan 2009" |
< | 小于 | [Sales Date] < "Jan 1 2009" |
>= | 大于或等于 | [Amount] >= 20000 |
<= | 小于或等于 | [Amount] <= 100 |
<> | 不等于 | [Region] <> "USA" |
除 == 之外的所有比较运算符都将 BLANK 视为等于数字 0、空字符串 "",DATE(1899, 12, 30) 或 FALSE。 因此,当 [Column] 的值为 0 或 BLANK 时,[Column] = 0 将为 true。 相反,仅当 [Column] 的值为 0 时,[Column] == 0 才为 true。
文本串联运算符
使用与号 (&) 联接或串联两个或多个文本字符串以生成一段文本。
文本运算符 | 含义 | 示例 |
---|---|---|
&(与号) | 连接或串联两个值以生成一个连续文本值 | [区域] & "、" & [城市] |
逻辑运算符
使用逻辑运算符 (&&) 和 (||) 组合表达式以生成单个结果。
文本运算符 | 含义 | 示例 |
---|---|---|
&&(双与号) | 在各有一个布尔值结果的两个表达式之间创建 AND 条件。 如果两个表达式都返回 TRUE,则表达式的组合也返回 TRUE;否则,组合将返回 FALSE。 | ([区域] =“法国”)&&([BikeBuyer] =“是”)) |
||(双竖线符号) | 在两个逻辑表达式之间创建 OR 条件。 如果任一表达式返回 TRUE,则结果为 TRUE;仅当两个表达式都为 FALSE 时,结果才为 FALSE。 | (([Region] = "France") || ([BikeBuyer] = "yes")) |
IN | 在要与表进行比较的每一行之间创建逻辑 OR 条件。 注意:表构造函数语法使用大括号。 | 'Product'[Color] IN { "Red", "Blue", "Black" } |
运算符和优先顺序
在某些情况下,计算的执行顺序可能会影响返回值;因此,请务必了解如何确定顺序,以及如何更改顺序以获得所需的结果。
计算顺序
表达式按特定顺序计算运算符和值。 所有表达式始终以等号 (=) 开头。 等号指示后面的字符构成一个表达式。
等号后面是要计算的元素(操作数),它们由计算运算符隔开。 表达式始终从左到右读取,但元素的分组顺序可以通过使用括号来适当控制。
运算符优先级
如果在单个公式中组合多个运算符,则按照下表对操作进行排序。 如果运算符具有相等的优先级值,则按从左至右的顺序进行排序。 例如,如果表达式同时包含乘法和除法运算符,则按照它们在表达式中出现的顺序从左到右进行计算。
运算符 | 说明 |
---|---|
^ | 求幂 |
– | 负号(如 -1 中的负号) |
* 和 / | 乘法和除法 |
+ 和 – | 加法和减法 |
& | 连接两个文本字符串(串联) |
=,==,<,>,<=,>=,<>,IN | 比较 |
NOT | 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。 然而,DAX 的基础计算引擎以 SQL Server Analysis Services 为基础,且还提供了关系数据存储的其他高级功能,包括更丰富的日期和时间类型支持。 因此,在某些情况下,计算结果或函数的行为可能与在 Excel 中有所不同。 此外,DAX 比 Excel 支持的数据类型更多。 本部分介绍两者的主要区别。
强制转换操作数的数据类型
通常,任何运算符左右两侧的两个操作数应为同一数据类型。 但是,如果数据类型不同,则在某些情况下,DAX 会将它们转换为通用数据类型以应用运算符:
- 将两个操作数转换为可能的最大通用数据类型。
- 应用运算符(如果可能)。
例如,假设你有两个要合并的数字。 其中一个数字通过公式得出,如 =[Price] * .20
,结果可能包含很多小数位。 另一个数字是作为字符串值提供的整数。
在这种情况下,DAX 将使用可以存储两种类型数字的最大数值格式将两个数字都转换为数值格式的实数。 然后,DAX 将应用乘法。
根据数据类型的组合,强制类型转换不能应用于比较运算。 有关 DAX 支持的数据类型的完整列表,请参阅表格模型中支持的数据类型和 Power BI Desktop 中的数据类型。
整数、实数、货币值、日期/时间和空白值用于比较目的时,会视为数值。 执行比较时,空白值的计算结果为零。 比较操作支持以下数据类型组合。
左侧数据类型 | 右侧数据类型 |
---|---|
数字 | 数字 |
布尔 | 布尔 |
字符串 | 字符串 |
其他混合数据类型比较将返回错误。 例如,公式(如 ="1" > 0)将返回一个错误,指出 DAX 比较操作不支持将类型为“文本”的值与类型为“整数”的值进行比较。
DAX 中使用的数据类型 | Excel 中使用的数据类型 |
---|---|
数字 (I8, R8) | 数字 (R8) |
字符串 | 字符串 |
布尔 | 布尔 |
DateTime | 变量 |
货币 | 货币 |
优先级顺序差异
DAX 公式中的操作优先顺序与 Microsoft Excel 使用的顺序基本相同,但不支持某些 Excel 运算符,如百分比运算符。 也不支持范围运算符。
因此,从 Excel 中复制和粘贴公式时,请务必仔细检查公式,因为公式中的一些运算符或元素可能无效。 如果对运算的执行顺序有任何疑虑,建议使用括号来控制运算顺序以便得到一个确定的结果。