在 DAX 中使用变量时需要了解的三件事
现在可以在 DAX 中长期使用变量来简化代码,有时还可以提高性能。以下是您需要了解的有关 DAX 变量的信息。
DAX 中的变量是什么
如果您已经知道如何在 DAX 代码中使用变量,请继续往下看。这部分适用于初学者。
变量可以在任何 DAX 代码中的 Power BI 和 SQL Server Analysis Services 中长期使用。
我们可以使用变量来存储中间结果。
您使用以下语法定义变量:
VAR VarName = <Value>
您无需在 DAX 中指定数据类型,因为数据类型是自动分配的。
你甚至不必提前声明一个变量。您在为它分配变量时就创建了一个变量。
创建变量后,必须将 RETURN 子句添加到 DAX 代码以返回值。
例如,我想使用名为 Var1 的变量执行查询,将其设置为 100 并返回此值:
EVALUATE
VAR Var1 = 100
RETURN
{Var1}
我需要添加大括号以将变量转换为一列一行的表。
那么,我们可以用变量做什么:
我们可以分配多个标量值
我们可以为 DAX 中的变量分配一个标量值,就像任何其他编程语言一样。
变量的创建如下所示:
VAR Var1 = 100
此行创建一个名为 Var1 的变量,并为其赋值 100。
此外,我们可以调用 DAX Measure 并将 Measure 的 Result 分配给变量:
VAR SalesAmount = [Sum of Sales Amount
然后在 Measure 的 Filter Context 中评估 Measure。
但我们可以做得更多。
我们可以将整个表添加到变量中,并在以下表达式中使用该变量。
例如,我想创建一个过去 45 天的日期列表并计算这些天的销售额:
DEFINE MEASURE ‘All Measures’[SalesLast45Days] =
VAR Last45Days = DATESINPERIOD(‘Date’[Date], MIN(‘Date’[Date]), -45, DAY)
RETURN
CALCULATE([Online Sales (By Order Date)]
,Last45Days
)
EVALUATE
ADDCOLUMNS(
SUMMARIZE(‘Date’
,’Date’[EnglishYearMonthShortName])
,”Sales”, [Online Sales (By Order Date)]
,”SalesLast45Days”, ‘All Measures’[SalesLast45Days]
)
我在 DAX Studio 的查询中动态创建了一个度量“所有度量”[SalesLast45Days]。
使用 DATESINPERIOD(),我生成一个日期列表,从查询的过滤上下文中的第一天到 45 天之前。然后将此列表分配给变量 Last45Days。
在 RETURN 之后,我将此表用作 CALCULATE() 函数中的过滤器。
结果如下图所示:
Sounds cool?
一个变量只计算一次
使用变量时,变量只计算一次,变量中的值可以在表达式中多次使用。
查看以下代码以计算年度销售额 (YoY) 的百分比变化:
[YoY %] =
VAR Sales = [Online Sales (By Order Date)]
VAR SalesPY = CALCULATE([Online Sales (By Order Date)]
,SAMEPERIODLASTYEAR(‘Date’[Date])
)
RETURN
DIVIDE(Sales — SalesPY, Sales)
如您所见,销售变量可以在 DIVIDE() 函数中重复使用两次。
这意味着分配给销售变量的度量的结果只计算一次。
测量结果如下:
Measure 中的变量的这种可重用性可以显着提高性能。
变量是只计算一次(一次?)
您可能已经注意到上面代码中的一个小细节。
当我可以重用一个变量时,为什么我不这样写 Measure 呢?
[YoY %] =
VAR Sales = [Online Sales (By Order Date)]
VAR SalesPY = CALCULATE(Sales
,SAMEPERIODLASTYEAR(‘Date’[Date])
)
RETURN
DIVIDE(Sales — SalesPY, Sales)
这一次,我在 CALCULATE() 函数中使用了销售变量。
不幸的是,这不起作用。
上面带有变体的查询的结果如下所示:
当我更改度量代码以返回 CALCULATE() 函数的结果时,我们可以找到原因:
您可以看到 CALCULATE() 函数的结果与 Original Sales Measure 相同。
原因是分配给变量的值已经被评估,并且过滤器上下文丢失了。因此,CALCULATE 不会影响结果。
在使用变量来理解 DAX 代码的结果时,您始终必须考虑过滤器上下文。
如果你不这样做,你会得到意想不到的结果。
Conclusion
变量是 DAX 工具带的重要组成部分,我建议使用它们来简化 DAX 代码。
当我在 DAX 中开发复杂的计算时,我总是使用变量来获得中间结果。使用这种方法,我可以交叉检查每个步骤并验证结果。
在 DAX 中使用变量的另一个好处是您可以避免创建中间度量,因为您可以在一个度量中完成所有操作。
感谢您阅读到最后。
Reference
我使用 Contoso 示例数据集,就像我之前的文章中一样。您可以在此处从 Microsoft 免费下载 ContosoRetailDW 数据集。[0]
Contoso 数据可以在 MIT 许可下免费使用,如此处所述。[0]
文章出处登录后可见!