数据分析表达式 (DAX) 语言使用运算符创建表达式,用于比较值、执行算术计算或处理字符串。
运算符类型
有四种不同类型的计算运算符:算术、比较、文本串联和逻辑。
算术运算符
执行加法、减法或乘法等基本数学运算;合并数字;并生成数值结果,请使用以下算术运算符。
算数运算符 | 含义 | 示例 |
---|---|---|
+ (加号) |
加法 | 3+3 |
- (减号) |
减法或负号 | 3-1-1 |
* (星号) |
乘法 | 3*3 |
/ (正斜杠) |
除法 | 3/3 |
^ (脱字号) |
求幂 | 16^4 |
注释
加号既可以用作 二元运算符 ,也可以用作 一元运算符。 二进制运算符需要运算符两侧的数字并执行加法。 在公式中使用二元运算符两侧的DAX值时,如果值不是数字,DAX会尝试将值转换为数字类型。 相比之下,一元运算符可以应用于任何类型的参数。 加号不会影响类型或值,并且只是被忽略,而减号运算符将创建负值(如果应用于数值)。
比较运算符
可以将两个值与以下运算符进行比较。 使用这些运算符比较两个值时,结果是逻辑值,要么是TRUE
,要么是FALSE
。
比较运算符 | 含义 | 示例 |
---|---|---|
= |
等于 | [Region] = “USA” |
== |
严格等于 | [地区] == “美国” |
> |
大于 | [销售日期] > “2009 年 1 月” |
< |
小于 | [销售日期] < “Jan 1 2009” |
>= |
大于或等于 | [金额] >= 20000 |
<= |
小于或等于 | [金额] <= 100 |
<> |
不等于 | [区域] <> “USA” |
除 == 之外的所有比较运算符都视为 BLANK 等于数字 0、空字符串“”、 DATE(1899、12、30)或 FALSE
。 因此,当 [Column] 的值为 0 或 BLANK 时,[Column] = 0 将为真。 相比之下,[Column] == 0 仅在 [Column] 值为 0 时才为 true。
文本串联运算符
使用 ampersand (&
) 联接或连接两个或更多个文本字符串,以生成一段文本。
文本运算符 | 含义 | 示例 |
---|---|---|
& (与号) |
将两个值连接或拼接成一个连续的文本值 | [Region] & ", " & [City] |
逻辑运算符
使用逻辑运算符 (&&
) 和 (||
) 合并表达式以生成单个结果。
文本运算符 | 含义 | 例子 |
---|---|---|
&& (双与号) |
在两个表达式之间创建一个 AND 条件,每个表达式都有一个布尔结果。 如果两个表达式都返回 TRUE ,则表达式的组合也返回 TRUE ;否则,组合返回 FALSE 。 |
([Region] = "France") && ([BikeBuyer] = "yes")) |
|| (双竖线) |
在两个逻辑表达式之间创建条件 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 一样。 但是,基础计算引擎基于 SQL Server Analysis Services,并提供关系数据存储的其他高级功能,包括对日期和时间类型的更丰富的支持。 因此,在某些情况下,计算结果或函数的行为可能与 Excel 中的结果不同。 此外, DAX 支持比 Excel 更多的数据类型。 本部分介绍主要差异。
强制转换操作数的数据类型
通常情况下,任何运算符左右两侧的两个操作数应为相同的数据类型。 但是,如果数据类型不同, DAX 则会将它们转换为通用数据类型,以在某些情况下应用运算符:
- 这两个操作数都转换为可能的最大通用数据类型。
- 应用运算符(如果可能)。
例如,假设你有两个要组合的数字。 其中一个数字通过公式得出,如 =[Price] * .20
,结果可能包含很多小数位。 另一个数字是作为字符串值提供的整数。
在这种情况下, DAX 将使用可存储这两种类型的数字的最大数字格式将这两个数字转换为数字格式的实数。 然后 DAX ,将应用乘法。
根据数据类型的组合,强制类型转换不能应用于比较运算。 有关DAX支持的数据类型的完整列表,请参阅 表格模型支持的数据类型 和 Power BI Desktop中的数据类型。
整数、实数、货币、日期/时间和空白被视为用于比较目的的数字。 执行比较时,空白值的计算结果为零。 以下数据类型组合支持比较运算。
左侧数据类型 | 右侧数据类型 |
---|---|
数字 | 数字 |
布尔值 | 布尔值 |
字符串 | 字符串 |
其他混合数据类型比较将返回错误。 例如,如 =“1” > 0 的公式返回一个错误,指出 DAX 比较作不支持将 Text 类型的值与 Integer 类型的值进行比较。
在DAX中使用的数据类型 | Excel 中使用的数据类型 |
---|---|
数字 (I8, R8) | 数字 (R8) |
字符串 | 字符串 |
布尔值 | 布尔值 |
日期/时间 | 变体 |
货币 | 货币 |
优先顺序的差异
公式中 DAX 作的优先顺序与Microsoft Excel 使用的优先级顺序基本相同,但不支持某些 Excel 运算符,例如百分比。 也不支持范围运算符。
因此,每当从 Excel 复制和粘贴公式时,请务必仔细查看公式,因为公式中的某些运算符或元素可能无效。 如果对执行作的顺序有任何疑问,建议使用括号来控制作顺序,并删除有关结果的任何歧义。