1. TREATAS
A. 语法
TREATAS ( , [, [, … ] ] )
B. 返回
表
C. 注意事项
第1参数必须是表表达式
D. 作用
只筛选对应关联值的数据
E. 案例
1). 单个筛选:
筛选姓名为张三的数据
Fiter('表1', '表1'[姓名]="张三")
筛选成绩大85的数据
Fiter('表1', '表1'[成绩]>85)
2). 多个条件筛选
筛选学科为数学,成绩大于85的。
Fiter('表1', '表1'[学科]="数学" &&
'表1'[成绩]>85
)
多条件的我们可以用&&来链接实现。
3). 多个恒等条件的筛选
筛选姓名等于张三,李四,王五并求总成绩。
Calculate(Sum('表1'[成绩]),Filter('表1','表1'[姓名]="张三" ||
'表1'[姓名]="李四" ||
'表1'[姓名]="王五"
)
)
通过||来表达”或”的意思,也就是3个人的姓名是平行的。
不用filter函数是否也能计算出如上效果呢?
4). 使用TREATAS链接关系函数进行平行筛选
Calculate(Sum('表1'[成绩]),Treatas({"张三","李四","王五"},
'表1'[姓名]
)
)
通过treatas函数把指定表的表达式对应到关系列上,然后通过关系筛选出关系列对应的值得数据来进行计算。{“张三”,”李四”,”王五”}实际上是一个列表,这个关系是并列的。
5). 使用TREATAS链接关系函数进行叠加筛选
Calculate(Sum('表1'[成绩]),Treatas({("数学",90),
("英语",85)
},
'表1'[学科],'表1'[成绩]
)
)
我们可以看到这里{(),()}的结构实际上是构成了2行2列的表。列的顺序对应了列字段的关系。也就是计算条件为:学科=数学,成绩=90以及学科=英语,成绩=85的成绩之和。
我们知道了,在筛选的时候可以通过列,也可以通过表来进行筛选,那是否可以有替代性的方案呢?
6). 使用现有条件列或者条件表来进行筛选
同理我们现在有一个条件表
表2
那我们需要根据条件表的列或者条件表的整体来进行求和。
- 根据表条件求和
我们可以直接在上面那个公式的基础上使用替换方式。
Calculate(Sum('表1'[成绩]),Treatas('表2',
'表1'[学科],'表1'[成绩]
)
)
表2实际上就代表{(“数学”,100),(“语文”,90),(“英语”,80)}
返回的结果是360,因为语文有2个90分。
- 根据列条件求和
如果只需要单列条件的话,通过Values或者SelectColumns都可以实现:
Calculate(Sum('表1'[成绩]),Treatas(SelectColumns('表2',"a",'表2'[成绩]),
'表1'[成绩]
)
)
返回的结果是530。这里通过SelectColumns来实现成绩等于100,90和80的求和。因为这里100的有1个,90的有3个,80的也有2个,加起来是530。
Calculate(Sum('表1'[成绩]),Treatas(Values('表2'[成绩]),
'表1'[成绩]
)
)
这里则使用的是values取单列的值。