[函数大全] DEFINE(可选)

  [复制链接]
查看229565 | 回复173 | 2021-2-21 23:01:36 | 显示全部楼层 |阅读模式
DEFINE 关键字是 EVALUATE 语法的一部分。一个 DEFINE 可以应用于一个或多个 EVALUATE 语句。

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

  1. [DEFINE {  MEASURE <tableName>[<name>] = <expression> }
  2.         {  VAR <name> = <expression>}]
  3. EVALUATE <table>
复制代码


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

示例
  1. DEFINE
  2.     MEASURE Sales[Quantity] =
  3.         SUM ( Sales[Quantity] )
  4.     MEASURE Sales[Total Cost] =
  5.         SUMX ( Sales, Sales[Quantity] * Sales[Unit Cost] )
  6. EVALUATE
  7. ADDCOLUMNS (
  8.     VALUES ( Product[Brand] ),
  9.     "Quantity", [Quantity],
  10.     "Cost", [Total Cost]
  11. )
复制代码
  1. DEFINE
  2.     VAR LastSalesDate =
  3.         MAX ( Sales[Order Date] )
  4. EVALUATE
  5. CALCULATETABLE (
  6.     SUMMARIZECOLUMNS (
  7.         'Product'[Product Name],
  8.         "Balance", CALCULATE (
  9.             [Amount],
  10.             'Date'[Date] = LastSalesDate
  11.         )
  12.     )
  13. )

  14. EVALUATE
  15. CALCULATETABLE (
  16.     SUMMARIZECOLUMNS (
  17.         Store[Store Name],
  18.         "Balance", CALCULATE (
  19.             [Amount],
  20.             'Date'[Date] = LastSalesDate
  21.         )
  22.     )
  23. )
复制代码


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

DEFINE MEASURE
  1. [DEFINE { MEASURE <tableName>[<name>] = <expression> }]
  2. EVALUATE <table>
复制代码


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

  1. DEFINE
  2.     MEASURE Sales[Quantity] =
  3.         SUM ( Sales[Quantity] )
  4.     MEASURE Sales[Total Cost] =
  5.         SUMX (
  6.             Sales,
  7.             Sales[Quantity] * Sales[Unit Cost]
  8.         )
  9. EVALUATE
  10. ADDCOLUMNS (
  11.     VALUES ( Product[Brand] ),
  12.     "Quantity", [Quantity],
  13.     "Cost", [Total Cost]
  14. )
复制代码


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


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



8278212320441.jpeg



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

  1. EVALUATE
  2. ADDCOLUMNS (
  3.     VALUES ( Product[Brand] ),
  4.     "Discounted Sales", [Discounted Sales]
  5. )
复制代码


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

  1. DEFINE
  2.     MEASURE Sales[Discounted Sales] =
  3.         SUMX (
  4.             Sales,
  5.             Sales[Quantity] * ( Sales[Unit Price] - Sales[Unit Discount] )
  6.         )
  7. EVALUATE
  8. ADDCOLUMNS (
  9.     VALUES ( Product[Brand] ),
  10.     "Discounted Sales", [Discounted Sales]
  11. )
复制代码


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

  1. [Total Sales] :=
  2. SUMX (
  3.     Sales,
  4.     Sales[Quantity] * Sales[Net Price]
  5. )
  6. [Average Price] :=
  7. [Total Sales] / SUM ( Sales[Quantity] )
复制代码


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

  1. DEFINE
  2.     MEASURE Sales[Total Sales] = 0
  3. EVALUATE
  4. ADDCOLUMNS (
  5.     VALUES ( Product[Brand] ),
  6.     "Total Sales", [Total Sales],
  7.     "Average Price", [Average Price]
  8. )
复制代码


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



8278212320442.jpeg


DEFINE VAR

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

  1. VAR
  2. <variableName> = <expression>
  3. RETURN
  4. <expressionConsumingVariable>
复制代码


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

  1. DEFINE
  2.     VAR ExpensiveProducts =
  3.         FILTER (
  4.             Product,
  5.             Product[Unit Price] > 3000
  6.         )
  7. EVALUATE
  8. CALCULATETABLE (
  9.     Product,
  10.     ExpensiveProducts
  11. )
复制代码


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

  1. [DEFINE
  2. [{ MEASURE <tableName>[<name>] = <expression> }]
  3. [{ VAR <variableName> = <expression> }]
  4. ]
  5. EVALUATE <table>
复制代码


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

  1. EVALUATE
  2. VAR ExpensiveProducts =
  3.     FILTER (
  4.         Product,
  5.         Product[Unit Price] > 3000
  6.     )
  7. RETURN
  8.     CALCULATETABLE (
  9.         Product,
  10.         ExpensiveProducts
  11.     )
复制代码
变量名不支持中文,只能使用英文、数字或下划线

小结

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

使用道具 举报

小斌斌 | 2021-4-25 16:00:12 | 显示全部楼层
very good。。。。。
回复

使用道具 举报

QQ小敏 | 2021-6-16 07:29:38 | 显示全部楼层
努力学习中
回复

使用道具 举报

tony仔 | 2021-7-11 21:18:18 来自手机 | 显示全部楼层
鼎力支持!!
回复

使用道具 举报

askazhi | 2021-8-15 06:31:21 来自手机 | 显示全部楼层
发发呆,回回帖,工作结束~
回复

使用道具 举报

VBS | 2021-8-28 23:03:28 | 显示全部楼层
努力,努力,再努力!!!!!!!!!!!
回复

使用道具 举报

小狼 | 2021-10-12 09:09:27 | 显示全部楼层
very good。。。。。
回复

使用道具 举报

plepman | 2021-11-16 20:56:20 | 显示全部楼层
努力,努力,再努力!!!!!!!!!!!
回复

使用道具 举报

baliuzhan | 2021-11-28 06:27:01 | 显示全部楼层
报告!别开枪,我就是路过来看看的。。。
回复

使用道具 举报

leo2008bj | 2021-11-28 22:31:52 | 显示全部楼层
支持,一直很喜欢老师的课程
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则