所有的 DAX 表达式都是在上下文中进行计算的。上下文即为公式计算所处的“环境” 。
比如一个最常见的度量值:收入=SUM(订单表[订单金额])
把这个度量值放到矩阵的值中,行为月份,那么它会计算出每个月的收入,如果把行换为产品名称,它还会返回每个产品的收入,请注意我们并没有在DAX表达式中指定要计算月度收入或者产品收入。
DAX表达式能返回不同的结果,就是因为上下文,你可以把一个公式的计算上下文想象成 DAX 在执行计算时所在报表单元格的周围区域,也就是它的环境。
DAX 的所有公式都是在各自的上下文环境中执行计算。即使是一样的代码,结果也会因为针对不同的数据子集而不同。
这种上下文被称为筛选上下文。正如其名字所示,它用来筛选表。依赖于执行计算时的筛选上下文,任何公式在计算后都可能会产生不同的值。尽管这很容易理解,这其中隐藏了很多复杂的逻辑。
报表中的每个单元格都有不同的筛选上下文。你应该这样理解:在同一个报表中,每个单元格有各自不同的上下文——就如不同的语境——与其他单元格相互独立。计算引擎可能会在一定程度上通过内部优化来改善计算速度,但你应认为,DAX表达式对于每个单元格都有一个潜在的,相互独立的,自主作用的上下文,包括总计行,总计行并非其他子行的合计,所以,即使在同一个报表中,合计行也可能会因DAX表达式的不同而显示与其他子行毫不相关的不同结果,这也就是你有时会看到总计行不等于明细行之和的原因,这并不是计算错误,而是在不同的上下文中独立计算的。
一个DAX表达式不止有单一的环境,比如收入这个度量值,可以在矩阵的行中放入月份字段,列中放入产品字段,切片期放入客户字段,这样就可以计算出每一个客户某个月购买某个产品的金额,所有的这些字段,都是这个度量值的筛选上下文。
筛选上下文是多个筛选的集合。它可以是矩阵的行、列、可以是切片器或者图表的轴等形式,这些都是外部筛选上下文。
DAX 的使用是需要极度精确的把握上下文。多数 DAX 的复杂性并不在于学习新的函数,而是很多微妙的概念。当这些概念混合在一起就会产生复杂的情形。上面提到的筛选上下文是外部指定。之后还会学到如何创建筛选上下文,能够理解在公式的每一部分哪些筛选上下文处于激活状态会变得更加重要。
《The Definitive Guide to DAX》学习笔记
采悟 @ PowerBI星球
网友评论