从数据到信息
从信息到洞察

DEFINE(可选)

DEFINE 关键字是 EVALUATE 语法的一部分。一个 DEFINE 可以应用于一个或多个 EVALUATE 语句。
DEFINE 关键字可以包含查询所使用的变量度量值的定义,这些定义对所有后续的 EVALUATE 语句都有效。但是,不能在查询内部定义的度量值中继续定义变量

[DEFINE {  MEASURE <tableName>[<name>] = <expression> } 
        {  VAR <name> = <expression>}]
EVALUATE <table>
术语 定义
tableName 使用标准 DAX 语法的现有表的名称,它不能是表达式且不可省略。
name 新度量值的名称。 它不能是表达式。
expression 任何返回单个标量值的 DAX 表达式。 表达式可以引用任何已存在的度量值 如果需要标量值,则将标量包装在 ROW() 函数中以生成表。
VAR 命名变量的表达式(可选), 变量可作为参数传递给其他表达式。

示例

DEFINE
    MEASURE Sales[Quantity] =
        SUM ( Sales[Quantity] )
    MEASURE Sales[Total Cost] =
        SUMX ( Sales, Sales[Quantity] * Sales[Unit Cost] )
EVALUATE
ADDCOLUMNS (
    VALUES ( Product[Brand] ),
    "Quantity", [Quantity],
    "Cost", [Total Cost]
)
DEFINE
    VAR LastSalesDate =
        MAX ( Sales[Order Date] )
EVALUATE
CALCULATETABLE (
    SUMMARIZECOLUMNS (
        'Product'[Product Name],
        "Balance", CALCULATE (
            [Amount],
            'Date'[Date] = LastSalesDate
        )
    )
)
 
EVALUATE
CALCULATETABLE (
    SUMMARIZECOLUMNS (
        Store[Store Name],
        "Balance", CALCULATE (
            [Amount],
            'Date'[Date] = LastSalesDate
        )
    )
)

初始的 DEFINE MEASURE 定义了用于本地查询的度量值(也就是说,它们存在于当前查询的生命周期中)。当调试公式时,它会非常有用,因为你可以定义一个局部变量,测试它,一旦它可以按照预期的行为运行,就把它放到模型中。

DEFINE MEASURE

[DEFINE { MEASURE <tableName>[<name>] = <expression> }]
EVALUATE <table>

你可以使用 EVALUATE 语句定义一个或多个度量值,如下面的示例所示:

DEFINE
    MEASURE Sales[Quantity] =
        SUM ( Sales[Quantity] )
    MEASURE Sales[Total Cost] =
        SUMX (
            Sales,
            Sales[Quantity] * Sales[Unit Cost]
        )
EVALUATE
ADDCOLUMNS (
    VALUES ( Product[Brand] ),
    "Quantity", [Quantity],
    "Cost", [Total Cost]
)

使用此语句,你必须将度量值与表名相关联*,如果使用表中已存在的名称,在行上下文不存在时,将在 EVALUATE 中重写原表达式。例如,前面的示例将用同名度量值覆盖表的 Quantity 列。你在结果的每一行中看到的值是为每个品牌聚合所有行的 Quantity 列的总和。

*实际上,除了这种情况之外,不建议在度量值前加表名

通常,在查询中重写已有名称不是一个好做法。但是,当你希望将数据模型中定义的度量值替换为查询使用的临时定义时(通常是出于调试或优化的原因),推荐你使用这种做法。例如,假设你有一个如下所示的查询,其中度量值 Discounted Sales 无法得到正确结果:

EVALUATE
ADDCOLUMNS (
    VALUES ( Product[Brand] ),
    "Discounted Sales", [Discounted Sales]
)

你可以创建具有相同名称的本地度量值,并对其进行修改和测试,直到计值正确为止,然后才在数据模型中复制更正后的度量值:

DEFINE
    MEASURE Sales[Discounted Sales] =
        SUMX (
            Sales,
            Sales[Quantity] * ( Sales[Unit Price] - Sales[Unit Discount] )
        )
EVALUATE
ADDCOLUMNS (
    VALUES ( Product[Brand] ),
    "Discounted Sales", [Discounted Sales]
)

在查询中重写数据模型的度量值不会影响数据模型的其他代码中对该度量值的现有引用。例如,考虑以下两个数据模型中的度量值:

[Total Sales] :=
SUMX (
    Sales,
    Sales[Quantity] * Sales[Net Price]
)
[Average Price] :=
[Total Sales] / SUM ( Sales[Quantity] )

如果在查询中重写了 Total Sales,你将看到它不会影响 Average Price 的计算,如下面的示例所示:

DEFINE
    MEASURE Sales[Total Sales] = 0
EVALUATE
ADDCOLUMNS (
    VALUES ( Product[Brand] ),
    "Total Sales", [Total Sales],
    "Average Price", [Average Price]
)

Average Price 在数据模型中计值,使用 Total Sales 的原生定义而不是在本地查询中的临时定义。

DEFINE VAR

你可以在 EVALUATE 语句中使用一种与标准语法略有不同的方式定义变量,通常我们在度量值中定义变量的语法是:

VAR
<variableName> = <expression>
RETURN
<expressionConsumingVariable>

RETURN 之后的表达式可以访问前面定义的变量。这种语法可以替换 DAX 中的任何标量或表表达式。但是,当你编写 EVALUATE 语句时,你也可以在 DEFINE 的部分定义变量,而不必在之后编写 RETURN:

DEFINE
    VAR ExpensiveProducts =
        FILTER (
            Product,
            Product[Unit Price] > 3000
        )
EVALUATE
CALCULATETABLE (
    Product,
    ExpensiveProducts
)

一个更完整的 EVALUATE 语法定义如下:

[DEFINE
[{ MEASURE <tableName>[<name>] = <expression> }]
[{ VAR <variableName> = <expression> }]
]
EVALUATE <table>

在任何情况下,只有在 EVALUATE 后的表达式中使用变量时,才会对该变量计值,并且变量的计算环境不依赖于定义变量后发生的筛选上下文操作,只和定义时的筛选条件有关。你也可以使用 VAR/Return 语法,如以下示例所示:

EVALUATE
VAR ExpensiveProducts =
    FILTER (
        Product,
        Product[Unit Price] > 3000
    )
RETURN
    CALCULATETABLE (
        Product,
        ExpensiveProducts
    )
变量名不支持中文,只能使用英文、数字或下划线

小结

DEFINE MEASURE 和 DEFINE VAR 这两种写法都可以在编写查询时使用,它们对之后的所有查询生效,也就是说你可以在不同的查询中引用这些度量值,而 VAR/RETURN 的写法只对当前查询或度量值生效

说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
  订阅本文评论  
提醒
DAX 圣经

DAX 函数大全

DAX 查询

DAX 运算符