复杂的事情简单做:用PQ实现是否包含某文本的匹配查询
👍
近期推送的文章
漂亮的分组平均线柱形图,财务分析必用 拯救大表哥必杀技,合并单元格的双头二维表转换成一维表 每天用着的SUMIF把我坑惨了,原来你是最熟悉的陌生人 如何用公式提取字符串中的数字?!经典公式,收藏备用 漂亮!新颖!这张顶级国际机构的表格,怎么制作的呢? 颠覆认知,用高德地图3步制作酷炫可视化地图
· 正 · 文 · 来 · 啦 ·
在日常工作中,常常会遇到一个问题,根据不同的条件判断单元格中的信息是否匹配。根据实际情况的不同,解决思路也各不相同。
例如在第1表张中,注明了不同商品的质量等级。现在将商品随机组合起来,形成一个礼品包。
如果这个包中有“良”等级的商品,那么这就是“二等包”,反之礼品包中全部为“优”等级的商品,这就是个“一等包”。
这个问题如果通过Power Query的M函数来解决,则函数比较容易写,而且不会太复杂。
在Power Query中解决这个问题的思路如下图,重点在于第二步,如何通过M函数判断礼品中包中否包含有质量等级为“良”的商品。
第1步:上载商品表
将包含商品质量等级信息的表上载到Power Query中。
第2步:筛选数据
修改表格名称为“商品信息”,并将质量等级为“良”的商品筛选出来。
第3步:以链接的形式上载表
此时对商品信息表进行上载,因为这张表的作用是信息查询,所以只要保留链接方面后面的查询就行。
第4步:上载第二张表
将需要判断等级的礼品包表格上载到PQ中。这里之所以没有上载“礼品等级”列,是因为后面用函数生成列即可,所以不需要这一列。
第5步:添加列
在上载的第二张表格中添加“自定义列”。
因为前面步骤中已经对“商品信息”表进行了筛选,所以在自定义列中,只需要写入M函数判断“礼品包”列中,是否包含“商品信息”表中的商品,如果有则返回“二等包”结果,反之则返回“一等包”结果
为了方便大家理解函数,下面将函数拆开进行演示。
第6步:判断“礼品包”是否包含“商品信息”表中的商品
输入函数:List.Transform(商品信息[商品],(x)=>Text.Contains([礼品包],x))
函数的详细解释:
1、List.Transform函数
作用:根据list列表返回新的列表。
语法:List.Transform(list as list,transform as function)
语法解释:List.Transform(要参照的list列表,返回方式)
2、(x)
这是一个匿名函数,用来存list列表的值。
3、=>符号
该符号表示处理方式,即用什么方式返回列表的值。
4、Text.Contains
作用:检测返回文本中否包含子字符串。
语法:Text Contains(text as nullable text,subsring as text)
语法解释:Text.Contains(文本,子字符串)
因此,该函数的逻辑如下图所示。
这一步的运算结果中,每一个礼品包都生成了新的list,而list的数量和之前的商品信息表数量是相对应的。
也就是说商品信息表中,有5件商品质量等级为“良”。那么函数依次判断礼品包中的文本,是否包含了这5件商品的名称,因此将生成5条TRUE或FALSE的判断结果。
第7步:完善函数判断等级
上面第6步已经解决最核心的判断了,接下来只需要完善函数,将判断结果以理想的结果呈现即可。
完整的函数为:
=if List.AnyTrue(List.Transform(商品信息[商品],(x)=>Text.Contains([礼品包],x)))
then"二等包"
else"一等包"
if函数和Any Ture用来判断,生成的list列表中是否包含“TRUE”值,有这个值则表示礼品包中有“良”的商品,那么返回的结果为“二等包”。
如果没有包含“TRUE”值,说明礼品包中没有“良”的商品,返回的结果为“一等包”。
第8步:上载结果
将生成的结果上载到Excel中就可以了。