calculate
前提: 理解上下文——行上下文 & 筛选上下文
语法:
calculate(expression,condition1,condition2,...conditionN)
condition是表,可以用语法糖形式表示(只能用于单列的 布尔条件 : = 、<、>、in、逻辑运算符, 转为为表时自带ALL())或者调节器
调节器有:
ALL 剔除筛选器
ALLSELETED 取外部所有可见的筛选器
ALL VALUES & ALLEXPECT 的区别:
USERELATIONSHIP :激活非活动的关系,! calculate调节器总是在所有筛选器参数生效之前应用。
CROSSFILTER :改变关系的交叉筛选方向或禁用筛选
KEEPFILTERS 保留筛选器 ;还有一种情况:用作迭代函数的顶层函数,意味着在每次上下文转换时,都运用keepfilters
ALL 类函数 : 都是calculate调节器,在显示筛选器参数之前作用于最终的筛选上下文
!无参数的ALL 和 ALLSELECTED 函数:
有参数–恢复当前视图之外的指定筛选条件
没有参数-- 恢复当前视觉对象之外所有活动的筛选上下文
没有参数的all-- 删除所有筛选上下文
避免使用完整的表作为筛选条件,特别时事实表,因为会包含扩展列,会影响性能
2>理解上下文转换
行上下文产生的场景: 迭代,计算列;calculate会将行上下文转换为筛选上下文(所有列)
计算列上的上下文转换
度量值上的上下文转换(度量值自带calculate):在任何行上下文中引用度量值,都将执行隐式的上下文转换
循环依赖:自动检测
规则总结:
计算顺序:
1-在初始计值上下文环境中计算所有的显示筛选器参数,包括原始行上下文(如有)和原始筛选上下文。
2-复制原始筛选上下文,丢弃原始行上下文
3-执行上下文转换。
4-计算调节器函数USERRELATIONSHIP\CROSSFILTER\ALL
5-将1的结果应用与现有上下文,并形成新的筛选上下文
(1>上下文转换先执行,2>调节器再执行,可以改变上下文转换结果,但是不能改变显式筛选器 ,3>最后执行显示筛选器,形成新的筛选上下文)