一个模糊匹配的度量,是怎么写出来的? | DAX案例及思路

2022-05-25 14:42:30 浏览数 (1)

前些天,我做了个小调查,让我比较意外的是,调查结果中,大家最想学习的竟然是DAX:

的确,对于很多初学DAX的朋友来说,函数一看好像都认识,因为大部分长得跟Excel里一模一样,但是,一要开始写个度量公式,可能就感觉很抓瞎!

接下来,我会继续用更多的例子,力求为到家拨开DAX的一些迷雾。

- 案例/问题 -

今天的例子比较简单——分别用计算列和度量两种方式,对编号进行模糊匹配:返回被非标准编号包含的标准编号。具体如下图所示:

对于这个问题,群里有朋友竟然写出了下面的度量,而且结果还是不对的:

为什么会搞得这么复杂!!!???有点儿感觉是去学了什么套路之类,然后想着往上套搞出来的——说实话,我没看懂!

前面的文章《DAX的核心,其实只有4个字!》里我讲过,DAX的核心思想,其实非常、非常简单,就四个字“筛选、计算”!——这四个字,大家永远也不要忘记,只要是写DAX公式,核心就是:怎么能把需要的数据筛选出来?数据筛选出来后,怎么计算?

- 思路/解法 -

回到这个例子,我们先看计算列的写法:

  1. 筛选

显然,就是用包含判断的方法(FIND),从标准编号里筛选(FILTER)出被当前非标准编号包含的数据。

  1. 计算

至于计算,这个问题就很简单,实际没有什么计算,只需要从筛选出来的数据里把需要的值取出来即可。

DAX里常用来从表中取值的方法是SELECTCOLUMNS,即取表的某列,此时如果是单行表(只有1行),得到的结果就是所需的结果。

综合起来,计算列公式如下:

说完计算列,再来看看度量怎么写。

首先,写度量,我们要看这个度量的结果放在什么样的环境(切片器/筛选条件等)下用?

对于这个问题,这里要求很简单,就是如下图所示的一个表或矩阵:非标准编号作为一列,通过度量计算得到的标准编号作为一列:

对于度量和计算列,其实现的思路其实都是一样的,还是我强调的“筛选、计算”四个字。只是,度量的计算环境通常要比计算列的要复杂,要注意的问题也多一些而已。

对于这个问题,非标准编号作为一列,总体上跟在表里写计算列其实很接近,即仍然是用FIND函数的方法,对标准编号表进行FILTER筛选,然后对筛选出的结果进行计算(取值)。

唯一要考虑的问题是度量总会面临一个“总计”的问题,这种情况下,如果按照计算列的方式,总计行就很容易碰到接收返回多个值从而导致出错的情况。

针对这种情况,最常用的方法就是加条件IF(ISFILTER())或IF(HASONEVALUE())或PBI里用SELECTEDVALUE()来避免总计行多余的计算。

最后的度量公式如下图所示:

其中都是几个简单的函数——当然,如果说这几个函数都还不会,那最好还是先把DAX的基础知识学一下。

最后再啰嗦一下,在基本掌握DAX的基础知识和常用函数的情况下,写DAX公式时,一定要谨记“筛选、计算”这个核心思路,确保思路清晰而不是一团乱麻——关于这个思路更加具体的应用,

0 人点赞