https://zhuanlan.zhihu.com/p/121773967
数据分析就是筛选、分组、聚合的过程,关于筛选,可以按一个维度来筛选,也可以按多个维度筛选,还有种常见的方式是,利用几个特定的维度值构成的表,作为条件表来筛选原始表。
也就是说,根据一个表,来筛选另外一个表,在PowerBI中怎么做,更具体一点,如何用DAX来完成呢?
假设原始数据记录为一张模拟的订单表:
还有一张表,命名为筛选条件表,
根据这个筛选表,来找出订单表中的记录,即找出1月2日产品A和B、以及1月3日产品B的销售记录。
这个问题相当于求两个表的交集,很自然的会想到用表函数
NATURALINNERJOIN来实现,直接用这个函数来新建表测试一下,
你会发现没法正常返回结果,错误提示也很清楚,没有公共联接列。
所以第一步应该先让两个表产生关系,但是两个表之间只能有一个维度的关系,无法同时在两个列上建立关系,那筛选条件是两个维度怎么做呢?
很简单,通过两个维度表建立关系就行了,
然后再用NATURALINNERJOIN就可以正常提取出需要的数据了,
如果觉得前两列是重复的,可以用SELECTCOLUMNS函数来选择结果表中需要的列。
就这个问题继续探索一下,如果筛选条件表和订单表没有建立关系,是否可以实现呢?
也是可以的,在DAX中还有个强大的函数,TREATAS,专门处理没有建立关系的情况,因为它可以在表之间构建虚拟关系,直接进行筛选。
可以将上面构建的数据模型中的关系全部删掉,在没有任何关系,也没有维度表,只有筛选条件表和订单表的情况下,使用TREATAS效果如下:
直接得出想要的结果,是不是很强大。
TREATAS函数在以前的案例中也使用过,但是没有详细介绍,其实它并不难理解。
DAX函数名称大部分都是用英文单词组合的,TREATAS,是个关系函数,可以理解为TREAT+AS:将xx视同为xx的意思。(具体语法请参考官方文档)
以上面的筛选为例,
--------TREATAS( '筛选条件表', '订单表'[订单日期], '订单表'[产品名称])--------
它就是将“筛选条件表”,视同为订单表中的订单日期列和产品名称列,用订单表中的两列来筛选订单表,当然是能返回正确的结果的。
TREATAS很好用,它可以在不破坏原有数据模型的前提下,根据现实的需要,在公式内部灵活的构建虚拟关系,来进行计算。
但它的灵活性也是有代价的,在虚拟关系下运行的速度比实体关系下要慢很多,当数据量较大时会明显的感觉到。
总结
本文通过一个常见的分析场景,给出两个解决办法,并通过这两种办法,认识了两种关系:实体关系和虚拟关系,虚拟关系的筛选是通过TREATAS函数实现的。
不要因为TREATAS可以不建立关系就能实现筛选,你就忽视建模的作用,在数据模型中建立实体关系总是很必要的。上面第一种方式是DAX数据分析的基本功,在此之上,学习更灵活的技巧,不经意间秀一下,更能让人刮目相看。