站点图标 AI技术聚合

在 DAX 中使用变量时需要了解的三件事

在 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]

文章出处登录后可见!

已经登录?立即刷新
退出移动版