第二个案例,和之前的有一些轻微的不同。现在不是在计算列,而是在度量值中要计算毛利润。你有一个销售额列,有一个成本列,你可能会这样写:
[GrossMargin] := Sales[SalesAmount] - Sales[ProductCost]
如果你写了这样一个度量值,你会得到什么结果
1.表达式正常工作,可以在报表中使用。
2.会得到一个错误,整个公式不能用。
3.你可以定义这个公式,但是在使用的时候会报错。
和之前一样,停下来,思考一下答案,然后再读下面的解释。
函数中,我们使用salesamount,代表计算列,也就是,sales表的销售额列。但是,这个定义,有缺少什么吗?回想一下,从前面的讨论中,缺少的信息是我们要从哪行来如何取得salesamount。当你在计算列中使用这个代码,DAX知道使用哪行来计算表达式,这多亏了行上下文。但是,用于度量值的时候,会发生什么?度量值计算没有迭代机制,所以就没有当前行,也就是,没有行上下文。
因此,第二个答案是对的。你不能书写这个函数,这个是个语法的错误,当你输入这个的时候,会报错。
记得,列本身并没有一个值。但是,列的每行都有值。因此,如果你要一个单一的值,你需要选择特定的行计算。要指定使用哪行,唯一的方法是使用行上下文。因为度量值中没有行上下文,这个公式会错误,然后DAX引擎会拒绝它。
在度量值中,这个函数的正确使用方法是使用聚合函数。
[GrossMargin] := SUM ( Sales[SalesAmount] ) - SUM ( Sales[ProductCost] )
使用这个函数,你使用sum这个聚合函数。因此,后面我们这个函数不依赖于行上下文。它只需要筛选上下文,然后就得到了结果。
网友评论