上一节 Power BI 计算组理解(一)中,提出可以将计算项理解为 特殊的自定义函数 ,其输入参数为度量值,不过上一节创建的计算组(收入、利润、利润率),在其值定义中并没有用到其输入的度量值本身。
其实很多情况下,计算组一般用在计算 年累计、去年同期、同比增长率 等类似场景,因为这些计算往往只是基础度量值不同,其他逻辑均相同,这样使用计算组就可以极大的简化度量值的编写。
在这种场景下,定义这类计算项,就需要使用其输入的度量值。获取输入到计算组的度量值需要使用dax函数SELECTEDMEASURE()。
下面创建一个 时间维度计算组,并在其创建三个计算项:
SELECTEDMEASURE()
CALCULATE ( SELECTEDMEASURE (), SAMEPERIODLASTYEAR ( '日期表'[Date] ) )
DIVIDE (
SELECTEDMEASURE (),
CALCULATE ( SELECTEDMEASURE (), SAMEPERIODLASTYEAR ( '日期表'[Date] ) )
) - 1
不过,当输入度量值为[利润率]时,上述计算组中的同比增长率(一般用来计算绝对数)可能没有意义,这时可以使用使用DAX函数 ISSELECTEDMEASURE()排除。
因此,可以将同比增长率计算项的定义更改为:
IF (
NOT ISSELECTEDMEASURE ( [利润率] ), //判断输入度量值是否为[利润率]
DIVIDE (
SELECTEDMEASURE (),
CALCULATE ( SELECTEDMEASURE (), SAMEPERIODLASTYEAR ( '日期表'[Date] ) )
) - 1,
BLANK ()
)
此时,该模型中就存在两个计算组,如果返回页面,将 时间维度计算组 表列[Name1]加入至切片器后,当前页面的度量值便同时受两个计算组所控制,如下
如果参照上一节的写法,此时页面的度量值实际转换成以下形成:
CALCULATE (
CALCULATE ( [值], '指标名称计算组'[Name] = "收入" ),
'时间维度计算组'[Name1] = "上年同期"
)
或
CALCULATE (
CALCULATE ( [值], '时间维度计算组'[Name1] = "上年同期" ),
'指标名称计算组'[Name] = "收入"
)
或
CALCULATE ( [值], '时间维度计算组'[Name1] = "上年同期", '指标名称计算组'[Name] = "收入" )
这三种都是等价的,他们最终都会转换为:
CALCULATE ([收入], SAMEPERIODLASTYEAR ( '日期表'[Date] ) )
需要注意的是,虽然也可以像其他表列一样,在DAX中直接引用其计算组表的名称列,但与其他列筛选并不相同:
1、在DAX中直接引用其计算项的名称,进行列筛选,该筛选只对度量值起作用
2、当模型中存在多个计算组时,其对度量值的重新定义改写存在先后顺序(改写的先后顺序会影响计算结果,本案例由于其特殊性,其不同的顺序计算结果相同),但该顺序由参数 Calculation Group Precedence 决定,不会因为在CALCULATE中写在外层就先执行外层。因此上面三种写法是等价的。
3、同一计算组,多个计算项通过CALCULATE嵌套筛选,内层筛选会覆盖外层筛选。
-------------------------------------------------------------