zl程序教程

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

当前栏目

忽略筛选器与自动匹配,这一点没深入讲的问题,其实早就碰到了!| DAX实战

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

在小黄书上,有个关于calculate函数的入门例子,通过all函数删除销售人员维度的影响,得到结果的同时,又带来一个问题如下:

筛选上下文是小勤和A产品,删去小勤这个筛选上下文,还留一个A产品,那A产品的销量为啥不是100,而是空白呢?

这是一位读者的疑问:

首先,能注意到这个细节并深入思考,很赞!

对于初学者来说,可以先按书上的说法“维度A产品和销售人员小勤的组合为空”——这个虽然不是最本质的解析简单理解,记住这种情况,然后在实际工作中先用起来。

而随着学习和应用的深入,比如开始接触到DAX里一个比较“高阶”的知识点:AutoExist(自动匹配),这个问题就会迎刃而解:

DAX里为了提升计算效率,对于不可能存在的组合(同一个表里),会直接在度量计算开始时予以剔除。

在此,我们稍作拓展:如果维度不是来自于同一个表,会什么情况?

比如,产品和销售两个维度分别从不同的维度表与销售明细表关联,模型如下图所示:

在这种情况下,这两个维度完全有可能存在组合(不能因为明细表中可能不存在而剔除,因为现在没有,以后可能有;明细表中没有,其他关联表中可能有……),所以,DAX里不会提前剔除再计算,所以,我们如果基于维度表做忽略计算:

sumOfSales_AllSales = 
       CALCULATE(
               [sumOfSales],
               ALL('factDetail'[销售])
       )

你会看到结果不太一样:

具体情况可下载本文配套案例文件查看:

https://share.weiyun.com/a8619S30

关于自动匹配,可以进一步参考我前期的文章《毁三观的自动匹配,到底是什么鬼?| DAX疑难点》,有兴趣的朋友可以深入了解一下,初学的朋友可以先有个简单的印象。

同时,对于DAX的学习,提供一点点建议如下:

1、初学者在学习基础的过程中,一般也可以不要陷在这些原理和细节的处理上,可以适当先加入点记忆;

2、在实际工作中先用起来,很多细节在实际工作的计算中不太会遇得到;

3、随着应用的深入,基础越来越扎实,同时也会遇到一些新的问题,然后再深入理解/修正。

学习,就是一个螺旋式前进的过程!