当两张表之间没有建立物理关系时,但又需要一张表筛选另一张表,可以利用treatas函数建立虚拟关系,其语法如下:
TREATAS(table, columnName, columnName…)
该函数的作用是将table中的列看作是columnName,继承ColumnName的关系(数据沿袭)。
返回值为一张表
注意:
1. Table 必须为表表达式,例如利用values, distinct等函数生成的表
2. 参数columnName在建立关系的同时,会清除应用在columnName上的筛选器

两个表之间并没有建立关系,那度量值score.notreatas不能够被学生表中的StuName筛选,而利用TREATAS函数建立了虚拟关系的度量值score.treatas就能被筛选了
score.notreatas=SUM ( 'YiLuXiangBei Stu Score'[Score] )
score.treatas=CALCULATE (SUM ( 'YiLuXiangBei Stu Score'[Score] ),TREATAS (VALUES ( 'YiLuXiangBei Stu Student'[StuName] ),'YiLuXiangBei Stu Score'[Stu]))

来自学生表的StuName不能筛选度量值score.notreatas,所以其结果都140;而利用TREATAS函数建立了虚拟关系后,学生表中的StuName继承了StuScore的关系,能够筛选度量值score.treatas,其结果为70;
以上就是TREATAS的用法,比较简单,接下来我们看一下:参数columnName在建立关系的同时,会清除应用在columnName上的筛选器这句话该怎么理解?
我们还是来看度量值score.treatas中的TREATAS函数,此时将Student表中的StuName看作是成绩表中的Stu,因此StuName能够筛选度量值,那来自成绩表的Stu到底能不能筛选该度量值呢?
score.treatas=CALCULATE (SUM ( 'YiLuXiangBei Stu Score'[Score] ),TREATAS (VALUES ( 'YiLuXiangBei Stu Student'[StuName] ),'YiLuXiangBei Stu Score'[Stu]))

结果是Stu并不能筛选度量值score.treatas,'YiLuXiangBei Stu Score'[Stu]作为TREATAS函数的第二参数时,清除了该列的筛选器,所以Stu不能够起到筛选的作用,可以利用KEEPFILTERS函数保持该列的筛选作用。
我是BISeven,欢迎与我交流
参考:
https://www.powerbigeek.com/understanding-treatas-function/
https://www.powerbigeek.com/understanding-treatas-function/




