DAX专题:11 DAX中的变量-Variables in DAX-读书笔记(19)

提示:因代码格式需要,本章内容代码示例使用了较多的Tab,使用手机观看可能会有些怪,在电脑观看效果更好。
本章向大家介绍DAX中变量的概念,2015年以来DAX语言就有了变量这个功能。如果你有编程经验的话,很容易理解什么是变量。如果你没有编程基础,那么你肯定应该理解数学方程中的未知数的概念,我们假设:X = 5 ,Y = 3, 那么X + Y等多少呢?在这个例子中,X + Y = 8,因为X被赋予了一个值5,Y被赋值为3。这个令X,Y等于多少的概念,就是DAX中变量的工作方式。DAX中使用变量时,也要先给变量起一个名字,再给它赋予一个值(这里的值是广义上的值的概念,这个值可以是一个表,也可以是一个具体的值,还可以是一个返回一个值的表达式等),然后可以在其它DAX公式中就可以使用这个变量了,就像刚刚举的X+Y的样子。
一、使用变量的规则 Rules for Using Variables
Here are a few simple rules related to using variables in DAX:
• You assign a variable by using the VAR keyword with the following syntax:
VAR variableName = <something>
• You can create as many variables as you want in a formula. You must define them all before using the
RETURN keyword.
• There is no comma after each defined variable. (You will see this below.)
• After you define at least one variable name, you must use the keyword RETURN to complete the
formula.
• Variables can be values or tables.
• A variable name cannot begin with an integer as the first character, but you can use integers as sub-
sequent characters in a name (e.g., 1stYear is not allowed, but Year1 is fine).
• Variable names cannot contain special characters (e.g., %)
• Variable names cannot be reserved words, such as function names.
• Once a variable has been assigned a value, that value cannot change prior to the RETURN keyword.
• Variables are local in scope to the formula. You cannot refer to a variable declared in one measure
from within a different measure.
❇️使用VAR关键字赋值变量,语法如下:VAR variableName =<something>
❇️你可以在公式中创建任意多的变量,在使用RETURN关键字之前,必须全部定义它们。
❇️每个定义的变量后面没有逗号。
❇️定义至少一个变量名后,必须使用关键字RETURN来完成公式。
❇️变量可以是值或表。
❇️变量名不能为汉字,不能以数字开头,但可以使用整数作为后面的字符(例如,不允许使用1stYear,但可以使用Year1)。
❇️变量名不能包含特殊字符(如%)。
❇️变量名不能为保留字,如函数名。
❇️一旦变量被赋值,该值不能在RETURN关键字之前更改。
❇️变量在公式中是局部的。不能在一个度量中引用另一个度量中的变量。
二、变量用法示例:求上一年的销售额 Total Sales MAT Revisited
在第16章中我们写过一个度量值用于求上一年的销售额
Total Sales MAT Improved =
IF(MAX('Calendar'[Date])>=DATE(2017,7,1),
CALCULATE([Total Sales],
FILTER(ALL('Calendar'),
'Calendar'[Date] > MAX('Calendar'[Date]) - 365
&& 'Calendar'[Date] <= MAX('Calendar'[Date])
)
)
)
现在让我们看看如何用变量改写上面的代码。仔细看看下面的公式,你会发现什么呢?(代码使用DAX Formatter工具进行了格式化,可以使用行号对公式进行解读。)
1 Total sales MAT Improved with Variables =
2 VAR StartMAT =
3 DATE (2017,7,1 )
4 VAR unfilteredCalendar =
5 ALL ( 'calendar ')
6 VAR endDate =
7 MAX( 'calendar ' [Date] )
8 VAR StartDate = endDate - 365
9 VAR Result =
10 IF(
11 MAX('calendar ' [Date] ) >= StartMAT,
12 CALCULATE(
13 [Total sales],
14 FILTER (
15 unfilteredCalendar,
16 'calendar ' [Date] > StartDate
17 && 'calendar ' [Date] <= endDate
18 )
19 )
20 )
21 RETURN
22 Result
Here are the key points I want you to take away from this latest version of the formula using the VAR syntax:
• Variables make the formula easier to read and understand.
• Good variable names effectively self-document the logic of the formula and make it easier to under-
stand.
• A variable can be assigned a constant (line 3), a table (line 5), or a value that can vary depending on
the filter context (line 7).
• A variable is reused inside the formula to create other variables (line 8).
从上面使用变量的代码中,我们不难发现:
❇️使用变量后,代码更容易阅读和理解了。
❇️变量名称要易于理解和记忆,理解公式代码的逻辑更容易。
❇️变量可以被赋值为一个常量(第3行),一个表(第5行),或者一个可以根据筛选上下文变化的值(第7行)。
❇️变量在公式中可以被重复使用,用于建其他变量(第8行)。
可能有的小伙伴会问,为什么把结果也写成一个变量呢?其实这样做是为了调试或检查代码更方便。我们可以在RETURN后面输出代码中的任何一个变量名,看看中间步骤的某个变量返回什么?如果最终步骤结果不对,就可以通过这种方法逐步排查代码。这也是使用变量的一大优势。
三、变量对性能的影响 Performance Impacts of Variables
使用变量时,你可能注意不到,或者不很明显的地方是:它可以提高公式的整体性能。例如,我们再看一下第4章中的[Margin %]度量值,并考虑使用变量和不使用变量的两个版本的公式。
这是不含变量的版本:Margin % full = DIVIDE([Total Sales] – [Total Cost],[Total Sales])
这是使用变量的版本:
1 Margin % Variables =
2 VAR Totalsales = [Total sales]
3 VAR Totalcost = [ Total cost]
4 VAR TotalMargin = Totalsales - TotalCost
5 VAR Result =
6 DIVIDE ( TotalMargin,Totalsales )
7 RETURN
8 Result
这个公式的第一个版本计算[总销售额]两次:一次在分子上(计算利润率),然后在分母上(计算百分比)。公式的第二个版本只计算[Total Sales]一次,并将其分配给一个变量(第2行)。所以变量可以帮助提高公式的性能。
注:Power BI引擎一直在不断更新和改进,开发人员总是不断寻找新的方法来提高PBI计算引擎的效率。实际应用中你可能觉得变量并没有发挥多大作用,因为软件开发人员在改进引擎方面做的大量优化工作部分上抵销了变量的功劳。即便如此,使用变量来编写公式仍然是一个很好的习惯或者说好方法,因为这样做可以使公式更容易阅读使用。
四、赋值后的变量是不可变的 Variables Are Immutable
如果你有编程基础的话,那么你应该非常熟悉变量的概念。但DAX中的变量有所不同。DAX中的变量实际上更类似于其他编程语言中的常量,而不是变量。DAX中的变量是不可变的,就是说一旦变量被赋值,那这个值就不再改变。在其它大多数编程语言中,你可以这样写:
X=5
X=X+1
变量X的值可以改变。但是在DAX中这是不可以的,一旦给DAX变量赋予了一个值,那这个值就不能再改变了,直到RETURN返回计算结果之前。
我们再看一个第9章的例子,度量值是:
Total Sales to Females =
CALCULATE([Total Sales], Customers[Gender] = "F")
假如我们使用变量这样改造度量值(这是个错误的示例,只为演示变量的不可变性)
1 Total sales to Females =
2 VAR Totalsales = [Total sales]
3 VAR Result =
4 CALCULATE (Totalsales, customers[Gender] = "F")
5 RETURN
6 Result
如果把度量值放在矩阵中,你会发现并不能得到正确的结果,就是因为Totalsales被赋予了总销售额度量值,在关键字RETURN之前,变量的值不可改变,所以Result结果是错误的。我们假设 [Total sales]=10000,相当于公式变成了这样:Result=CALCULATE (10000, customers[Gender] = "F"),这个10000不能被条件筛选了。
我们可以将代码修改成这样:
1 Total sales to Females =
2 VAR Totalsales = [Total sales]
3 RETURN
4 CALCULATE (Totalsales, customers[Gender] = "F")
在关键字RETURN之后,就一切正常了。