分享

三种方法实现跨表VLOOKUP,轻松搞定多重匹配取数!

 大海_Power 2021-05-22

- 1 -

       首先,说一下为什么不用合并查询。

       这其实源于一个实际的工作问题,简化后的情况如下:先按合同号匹配数量,如果合同号没有匹配到,再按计划号匹配。即多重匹配取数:

        这个问题当然也可以通过多次合并查询来解决,比如先按合同号合并查询,再按计划号合并查询,然后再写个判断:

= if [合同]<>null and Table.RowCount([合同合并])>0then [合同合并]{0}[量]else if [计划]<>null and Table.RowCount([计划合并])>0 then [计划合并]{0}[量] else null

- 2 -

       估计有些朋友会被上面的判断语句给绕晕,因为的确写起来比较麻烦!那么,是否有像在Excel里写IFERROR+VLOOKUP类似的方法呢?

      当然是有的,但也是通过M语言(函数)的方式来实现,那么问题来了,M里虽然有类似IFERROR的简单关键词:try ... otherwise ...,但并没有一个跟VLOOKUP一样的函数哦!怎么办?我们先用下面这个最简单的例子来看看:

1、表筛选法

表筛选法其实最容易理解,即用Table.SelectRows函数,从表里筛选出符合条件的数据,然后按需要取其中的1条(如第1条)即可:

但这里面其实有一点儿不好的地方,即当匹配不到内容的时候,得到的结果是错误:

      虽然,Excel里用VLOOKUP的结果也是错误,虽然,即使得到错误上传到Excel中也会显示为空,但是,我们其实还是可以再改进一点点儿,让它直接显示为空:

       即,不要用“表[列]{0}”的方式去取值,改用List.First函数去取值。

2、跳位法

       跳位法即使用函数Table.Skip,跳过不符合条件的数据,直接到达符合条件的数据,然后进行提取。如下图所示:

      同样的,因为结果是表,所以也可以通过List.Fisrt函数来避免错误结果的出现。

       跳位法跟筛选法的差别在于,筛选法会对整表各行进行判断,然后返回满足所有条件的行,而跳位法只需要对表的前面部分行进行判断,直到找到对应的行即返回剩余表的所有内容。

       理论上来说,跳位法可能会比筛选法的效率高一点儿——当然,跳位法返回表的内容比筛选法返回的要多,所以也可能占更大的内存空间,所以,实际效率问题还是应根据实际情况进行试验确定。

3、内容定位法

      在以前的文章《重要!很重要!非常重要!理解PQ里的数据结构(四、根据内容定位及筛选行)》里,其实讲过这种方法:

      用在模拟VLOOKUP上,这个写法最简单:

      但,使用这个写法的时候,一定要注意一个问题,即,如果存在多个符合条件的内容,那将得到错误的结果,具体可参考上面文章。

      如果希望能在存在多个符合条件的内容时,仍使用该方法,可以先对匹配所引用的表(如本案例中的V源表)去重,这样就能避免问题的出现,即公式修改如下:

- 3 -

       有了上面模拟VLOOKUP写法的基础,要实现文章开始的多次匹配问题,其实就非常简单了,比如,这里因为源数据里没有重复内容的影响,所以,我们可以直接用上面第3种——内容定位法:

       关于其他方法,大家可以多动手试试——只有自己动手写过,才更能掌握和理解这些解决问题的思路和方法哦。

【近期热门文章】

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多