我们经常使用返回表的表达式作为其他 DAX 函数的参数,比如 RELATEDTABLE
在迭代表的函数中, 表的每行计值 DAX 表达式,这里的表就可以使用返回表的表达式来做进一步约束。
使用方法
[Sales Amount] := SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
你可以使用其他表函数替换对销售表引用。例如, 你可以使用 FILTER 函数筛选数量大于 1 的销售记录:
[Sales Amount Multiple Items] := SUMX ( FILTER ( Sales, Sales[Quantity] > 1 ), Sales[Quantity] * Sales[Unit Price] )
在计算列中, 还可以使用 RELATEDTABLE 函数检索位于一对多关系多端的表的所有行。例如,以下产品表的计算列统计所有产品对应的销售金额:
Product[Product Sales Amount] = SUMX ( RELATEDTABLE ( Sales ), Sales[Quantity] * Sales[Unit Price] )
在关系函数和理解关系这两篇文章中,可以找到 RELATEDTABLE 的详细说明。
你可以将对表函数的调用嵌套在同一个 DAX 表达式中,因为任何表表达式都可以是对表函数的调用。例如,在下面的产品表计算列中,只考虑数量大于 1 的销售记录,计算产品销售额。
Product[Product Sales Amount Multiple Items] = SUMX ( FILTER ( RELATEDTABLE ( Sales ), Sales[Quantity] > 1 ), Sales[Quantity] * Sales[Unit Price] )
当发生表函数的嵌套调用时, DAX 首先计算最内层函数, 然后逐级计算到最外层。不要将此规则与 CALCULATE 函数调用参数时的计算顺序混淆。
正如你稍后将看到的, 嵌套调用的执行顺序可能是造成理解混乱的根源, 因为 CALCULATETABLE 的计值顺序与 FILTER 不同。在迭代函数章节, 你将了解 FILTER 的行为, 在 CALCUALTE 函数一节会介绍关于 CALCULATETABLE 的内容。
其他表函数
DAX 中有很多可以返回表的函数,如 ALL、ADDCOLUMNS、INTERSECT、SUMMARIZE、TOPN 等等,基于这些表函数可以衍生出各种灵活的表表达式,这些表函数将在各自对应的章节中介绍。
Product[Product Sales Amount Multiple Items] =
SUMX (
FILTER (
RELATEDTABLE ( Sales ),
Sales[Quantity] > 1
),
Sales[Quantity] * Sales[Unit Price]
)
作为度量值应用于矩阵中行上有筛选这个筛选是筛选那个表呢?是RELATEDTABLE ( Sales )生成的表还是sales表?谢谢
老师,最后一个计算列的执行顺序:
1.产品表第一行转换筛选上下文;
2. 筛选sales表;
3.filter迭代被筛选后的sales表
4. 迭代计算每行的数量乘以 价格
5.sumx汇总
老师,如不对,应该怎样顺序?谢谢