上次我们初步介绍了Calculate函数, 这应该是DAX中最重要的函数了:Calculate - Power Excel 其中遗留了一个问题,那就是我们如此创建的两个度量值: D1
和D3
是否一样。 从文本上分析看,这两个度量值的似乎是差不多的。 因为,如果我们考虑第一个度量值的另外一个写法,D2
你会发现一个是对产品表的筛选,一个是对产品表BrandName列的筛选。 但是二者的结果却完全不同: 第二列是使用D1写法的度量值,第三列是使用D2写法的度量值,这二者是完全一样的,所以结果相同。第四列是使用D3写法的度量值,与前二者完全不同。 在这个写法中,可以看到,外部筛选器上下文起作用了,并没有被内部筛选器上下文覆盖掉。 分析D3写法中的语法,我们发现,Filter使用的表是Product,而Product是会首先被外部筛选器上下文筛选的,这样在第一行,BrandName为A. Datum中,首先将Product筛选,只包含那些BrandName为A. Datum的行,然后再接受内部筛选器的筛选,结果为空表。 所以该行的度量值为空! 很是奇怪,我们之前介绍过Calculate的规则: 如果作用在相同的列上,内部筛选器上下文会覆盖外部筛选器上下文。 为什么在这里不起作用了? 其实,仔细看一下这三者的语法上的区别,会发现,那个规则之所以起作用,完全是因为其中的ALL函数。 在D2写法中(D1写法实质就是D2写法的简写):
ALL函数导致了对外部筛选器的忽略。 如果我们将ALL函数施加到D3写法中Product表中,仍然得到相同的结果,
当然,很多场景中我们希望保持外部筛选器上下文,而不让它们被覆盖。所以很多人经常使用上面的写法。 不过这并不是一个很好的方式,因为会带来性能方面的严重下降(具体原因我们后面的文章会详细分析)。 更好的方式是使用modifiers函数:keepfilters,
这个函数的作用是告诉DAX引擎,在评估括号里的内部筛选器上下文时,不要覆盖外部筛选器上下文。 这样,我们就得到了与期望相同的结果: DAX中的modifiers函数还有很多,像这里提到的all,此外还有allexcept,allnoblankrow,allselected,removefilters等等,大家可以研究一下这些函数,对深入理解DAX有非常大的帮助。 本文涉及的DAX函数及其他DAX函数,在E学会课程中有详细介绍! 详情咨询客服(底部菜单-知识库-客服) Excel+Power Query+Power Pivot+Power BI 自定义函数 底部菜单:知识库->自定义函数 面授培训 底部菜单:培训学习->面授培训 Excel企业应用 底部菜单:企业应用 |
|