zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

INTERSECT函数左右表互换,结果不一样!DAX的这个重要特性一定要理解!| PP实战

2023-04-18 16:05:39 时间

- 1 -

INTERSECT是DAX的重要函数之一,使用方式为intersect(表1,表2),它的基本功能是获得两个表的交集,如下图所示:

既然这样,那么,如果单纯从返回的数据结果来看,把两表的位置进行互换,所得的结果应该是一样的。

举个具体的例子,比如有表1和表2如下所示:

那么,如果我们用DAX新建表,无论是用 INTERSECT('表1','表2')

,还是 INTERSECT('表2','表1'),结果的内容都是一样的:

但是,细心的朋友可能也会发现,虽然包含的内容是一样的,但是,顺序却不一样!

为什么呢?

这是因为INTERSECT函数运算时以左表为基准,判断右表是否存在相应的值,所以,生成的结果以左表为基准,内容的排列顺序也按左表的原始顺序。

如果单纯从数据本身来说,这个顺序问题也没什么特别影响。但是,如果将INTERSECT函数用作筛选(计算上下文),左右表的位置的不同,对结果会有明显的影响。

- 2 -

比如我在前面的文章《【免费视频】虚虚实实的各种表间关系,咋整?这个交叉关联分析案例一次全讲完!| DAX实战》里,在多个解法里使用INTERSECT函数:

视频主要内容:

1、基于仓库商品表构建仓库及辅助仓库维度表;

2、四种表间关系设置及其筛选(计算)方法:

2.1 表间不建关系;

2.2 表间全部构建活动关系;

2.3 表间全部构建非活动关系;

2.4 与仓库主表构建活动关系,与辅助表构建非活动关系。

视频中讲到使用INTERSECT函数的使用,有的朋友就在尝试将两个表进行互换,发现得到的结果完全不一样:

这里的问题跟前面用intersect新建表的情况类似,intersect函数引用两个表,无论两个表的位置如何,函数本身得到的“数据”结果其实是没有差别的。

但是,这两个度量的结果却完全不一样,根本原因不是intersect本身的“数据”结果不同,而是intersect返回的结果对后续的影响不同:intersect的计算以第一个参数表为基础,生成的结果也会继承第一个表的筛选器作用!

所以,对于“测试”度量来说,因为第一个表是fact,所以intersect函数返回的结果会对前面calculatetable函数的计算参数有影响:

而对于“测试_反转顺序”来说,intersect函数第一个参数为dim表,返回结果对fact仓库表不起筛选作用(这里两表间没有建立活动关系):

而如果建立了'dim仓库'表和'fact仓库商品表'之间的激活关系,那'dim仓库'表对'fact仓库商品表'也存在筛选关系,那“测试”和“测试_反转顺序”两个度量的结果就一样了:

具体数据及度量情况,大家可按以下链接下载本文配套数据测试:

https://share.weiyun.com/9VdCbtA4

最后,再次强调DAX里的这个【重要特性】

DAX里要注意的不光是返回来的结果“数据”本身,还要注意返回的是什么表,什么列,这些列是否会对其他计算有影响——虽然返回的数据一样,但是,对其他计算的影响不一样。