前些天,我做了个小调查,让我比较意外的是,调查结果中,大家最想学习的竟然是DAX:
的确,对于很多初学DAX的朋友来说,函数一看好像都认识,因为大部分长得跟Excel里一模一样,但是,一要开始写个度量公式,可能就感觉很抓瞎!
接下来,我会继续用更多的例子,力求为到家拨开DAX的一些迷雾。
- 案例/问题 -
今天的例子比较简单——分别用计算列和度量两种方式,对编号进行模糊匹配:返回被非标准编号包含的标准编号。具体如下图所示:
对于这个问题,群里有朋友竟然写出了下面的度量,而且结果还是不对的:
为什么会搞得这么复杂!!!???有点儿感觉是去学了什么套路之类,然后想着往上套搞出来的——说实话,我没看懂!
前面的文章《DAX的核心,其实只有4个字!》里我讲过,DAX的核心思想,其实非常、非常简单,就四个字“筛选、计算”!——这四个字,大家永远也不要忘记,只要是写DAX公式,核心就是:怎么能把需要的数据筛选出来?数据筛选出来后,怎么计算?
- 思路/解法 -
回到这个例子,我们先看计算列的写法:
- 筛选
显然,就是用包含判断的方法(FIND),从标准编号里筛选(FILTER)出被当前非标准编号包含的数据。
- 计算
至于计算,这个问题就很简单,实际没有什么计算,只需要从筛选出来的数据里把需要的值取出来即可。
DAX里常用来从表中取值的方法是SELECTCOLUMNS,即取表的某列,此时如果是单行表(只有1行),得到的结果就是所需的结果。
综合起来,计算列公式如下:
说完计算列,再来看看度量怎么写。
首先,写度量,我们要看这个度量的结果放在什么样的环境(切片器/筛选条件等)下用?
对于这个问题,这里要求很简单,就是如下图所示的一个表或矩阵:非标准编号作为一列,通过度量计算得到的标准编号作为一列:
对于度量和计算列,其实现的思路其实都是一样的,还是我强调的“筛选、计算”四个字。只是,度量的计算环境通常要比计算列的要复杂,要注意的问题也多一些而已。
对于这个问题,非标准编号作为一列,总体上跟在表里写计算列其实很接近,即仍然是用FIND函数的方法,对标准编号表进行FILTER筛选,然后对筛选出的结果进行计算(取值)。
唯一要考虑的问题是度量总会面临一个“总计”的问题,这种情况下,如果按照计算列的方式,总计行就很容易碰到接收返回多个值从而导致出错的情况。
针对这种情况,最常用的方法就是加条件IF(ISFILTER())或IF(HASONEVALUE())或PBI里用SELECTEDVALUE()来避免总计行多余的计算。
最后的度量公式如下图所示:
其中都是几个简单的函数——当然,如果说这几个函数都还不会,那最好还是先把DAX的基础知识学一下。
最后再啰嗦一下,在基本掌握DAX的基础知识和常用函数的情况下,写DAX公式时,一定要谨记“筛选、计算”这个核心思路,确保思路清晰而不是一团乱麻——关于这个思路更加具体的应用,