Table of Contents

代码操作 DR006(可读性)将常量聚合移到 VAR 变量中

描述

当在迭代器或标量谓词中使用聚合函数时,该聚合在迭代的每一行都会产生相同的结果,因此可以将该聚合移到迭代之外的 DAX 变量中。

示例

将:

CALCULATE(
    [Total Sales],
    'Date'[Date] = MAX('Date'[Date])
)

改为:

VAR _maxDate = MAX('Date'[Date]) 
RETURN
    CALCULATE(
        [Total Sales], 
        'Date'[Date] = _maxDate
    )

为什么 Tabular Editor 会建议这样做?

对刚接触 DAX 的开发者来说,一个常见的困惑是行语境和筛选语境的概念。 当在迭代器或标量谓词中使用聚合时,该聚合在迭代的每一行都会产生相同的结果。 这也正是为何能使用诸如 'Date'[Date] = MAX('Date'[Date]) 这样的语法。 这种语法可用且高效,但可能会让新开发者感到困惑——尤其是有 SQL 背景的开发者,因为在 SQL 中这类语法通常会被视为错误。

过去 DAX 不支持变量,因此实现这种语法的唯一方式就是在迭代器中直接使用聚合函数。 不过,随着 DAX 引入变量,现在可以将该聚合移到迭代之外的变量中。 这会让代码更易读,也更便于新开发者理解。 这也让代码更易于调试,因为你可以在迭代之外检查变量的值。

备注

默认情况下,Tabular Editor 使用 _ 作为变量的前缀。 你可以在 工具 > 偏好 > DAX编辑器 > 代码操作 下更改前缀。

分配给变量的名称由聚合函数与列名拼接而成。 如果变量名在该作用域内不唯一,则会在末尾追加数字使其唯一。