全集《孙兴华讲PowerBI视频版》
https://www.ixigua.com/6976409163886756383
上节课我们学习了USERELATIONSHIP函数功能是启用备胎关系(虚线),并终止现任关系(实线)
截止上节课,我们已经完整地学习了,Calculate两个调节器函数,分别是ALL函数和USERELATIONSHIP函数
并且了解到KEEPFILTERS是筛选参数调节器(只是将不能筛选的参数恢复筛选),它并不是Calculate调节器,KEEPFILTERS不止只可以在Calculate中使用,同时也可以在迭代函数中使用,例如 Sumx(keepfilters(ALL(表[列])),表达式)
同时,学习了Calculate调节器(等级)优先于筛选器,同级别从左向右执行。
接下来,我们再了解一下类似函数:CROSSFILTER函数,函数本身不返回任何值,只改变参数内的关系
这个函数并不是特别重要,它有等价函数可以代替其功能
但是,你仍然要保证表与表之间是一对多关系(我们不讨论一对一与多对多关系)
《DAX神功》第1卷第1回已经明确一对多原则,一百年不许变。
《孙兴华讲PowerBI火力全开》笔记28.03对这个函数做了详细讲解
详细案例请参考《火力全开》
【1】使用CROSSFILTER函数前提两表之间有实线关系
如果你两张表之间本身就没有连线,这个函数无法帮你连线。
【2】第1参数和第2参数的位置无所谓,它可以自动识别
度量值1 = CALCULATE(SUM('多端'[分数]),CROSSFILTER('一端'[学号],'多端'[学号],None))
等价
度量值1 = CALCULATE(SUM('多端'[分数]),CROSSFILTER('多端'[学号],'一端'[学号],None))
【3】第3参数:None 无筛选 其实就是禁用关系,将原本的连线临时删除
但是,它与USERELATIONSHIP函数一样,都是在这个度量值里面生效的。
就好比在Access中跟大家讲的,两个表连线是结婚的关系,而查询中的两个表连线是演员演夫妻的关系。现在就是演员演夫妻的关系。
USERELATIONSHIP函数与CROSSFILTER函数,他们对关系的处理都是在本度量值之内生效的,并没有改变原始关系模型。
例如:我想得到多端表中分数的度量值,但是不想让一端表中的字段筛选它
但是,由于一端表与多端表是一对多关系,一端表本身具有筛选多端表的功能
我可以在度量值1中取消两表之间的连线关系:
度量值1 = CALCULATE(SUM('多端'[分数]),CROSSFILTER('一端'[学号],'多端'[学号],None))
由于USERELATIONSHIP函数功能是启用备胎关系(虚线),并终止现任关系(实线)
如果你是想将现任关系(实线)终止,而不启用任何备胎(虚线)关系时,这个函数就派上用场了。但是方法不止一种,ALL函数同样可以实现一端表所有列不能筛选,例如:度量值2
度量值2 = CALCULATE(SUM('多端'[分数]),all('一端'))
【4】第3参数:Both 双向筛选
《DAX神功》第1卷第2回 避免使用双向箭头 中做了明确的说明 不建议大家使用双向箭头
【5】第3参数:Oneway 单向筛选
(1)如果关系模型中是双向筛选,你可以在度量值中将其改成单向筛选
但是,我始终就不建议你使用双向筛选关系
(2)提升速度
【度量值】总分1 = sum('多端'[分数])
【度量值】总分2 = CALCULATE( sum('多端'[分数]),CROSSFILTER('一端'[学号],'多端'[学号],OneWay))
由于两张表之间是一对多关系,一端可以筛选多端
但是你写的【总分1】,直接放到模型中,当数据量较大时,速度会慢,因为它会通过矩阵中一端表的学号筛选【总分1】
如果写成【总分2】的样子,它在度量值内部就已经使用了关系筛选,提升速度。
Ps: 速度是虚无飘渺的事情,如果数据量太大,就不建议使用PowerBI了。届时,你可以考虑SQL或Pandas等
【6】calculate多层嵌套CROSSFILTER时最内层生效
同上节课的USERELATIONSHIP函数
Ps: 第3参数还有两个OneWay_LeftFiltersRight和OneWay_RightFiltersLeft不用学习了。
本文暂时没有评论,来添加一个吧(●'◡'●)