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 的写法只对当前查询或度量值生效 |