多对多查询2:按条件的顺序输出结果

小伙伴们,你们还好吗?离上班的日子越来越近了,口罩还没有着落,愁人。希望疫情尽快结束,一切都好起来。我在家里也就是学习研究一下excel函数,同时也把我学会的分享给大家。昨天说了多对多的查询,只是结果的顺序和数据源的顺序一样。今天来说下按条件的顺序输出结果,上次的文章结尾有演示过。

1.筛选出部门满足黄色区域这些条件的记录

如下图所示,当黄色区域选择1个条件时,就把左表满足这个条件的记录全部查询出来;选择第2个条件时,紧接着把满足第2个条件的记录再全部查询出来;以此类推,这样的话相同的部门是排列在一起的。那这个效果是怎么做到的呢?

先说点题外话,其实在我早期学excel的时候就遇到过这个问题,当时就想实现这个效果,可是水平有限,一直没能解决。但我还在慢慢的学习,不断的积累。最近偶然间又碰见了这个问题,就尝试着再做一次,做的时候才发现这个问题和我发过的有些文章中的问题思路一样,所以就顺理成章的解决了。随着知识的积累和认知的扩展,之前的难题回过头来再看已经不是难题了。这是一点小的感悟。

还是回到咱们的问题上,怎么才能实现这样的效果呢?我先把公式写出来,然后再一点点说明。在F3单元格输入公式=IFERROR(INDEX(A:A,MOD(SMALL(IF($B$3:$B$16=$F$1:$I$1,COLUMN($F:$I)/1%+ROW($3:$16)),ROW(A1)),100)),""),按ctrl+shift+enter三键结束,向右向下填充。

先来看if函数,它的第1参数$B$3:$B$16=$F$1:$I$1就是用B列的部门和黄色区域的条件进行相等的判断,成立的返回true,不成立的返回false,结果如下图1所示。第2参数COLUMN($F:$I)/1%+ROW($3:$16)是用F3:I16这个区域的列号乘以100再加上行号,返回的结果如下图2所示。

=IF($B$3:$B$16=$F$1:$I$1,COLUMN($F:$I)/1%+ROW($3:$16))这部分返回的结果如下图所示,就是让第1参数为true的返回第2参数对应的数字,第1参数为false的返回false。接下来,我们要用small依次提取第1个最小值,第2个最小值,一直提完。这样的话,就是按列提取的,先提取出生产部那一列的,然后是销售部的,。。。正是这样的方式,最后的部门是按顺序排列在一起的。

=SMALL(IF($B$3:$B$16=$F$1:$I$1,COLUMN($F:$I)/1%+ROW($3:$16)),ROW(A1))这部分就是用small从上一步的结果中提取出第1个最小值607,公式下拉,提取第2个最小值609,。。。以此类推,一直提取完,到出现错误值为止。提取出这样的结果有什么用呢?其实我们要的是后2位数字,后2位代表的行号,比如607代表的是6列7行。接下来我们就要取出行号。

=MOD(SMALL(IF($B$3:$B$16=$F$1:$I$1,COLUMN($F:$I)/1%+ROW($3:$16)),ROW(A1)),100)这部分就是用mod把上一步的结果除以100取余数,得到了行号,如下图所示。再下一步就是用index返回对应行列的内容。

=INDEX(A:A,MOD(SMALL(IF($B$3:$B$16=$F$1:$I$1,COLUMN($F:$I)/1%+ROW($3:$16)),ROW(A1)),100))这部分就是用index返回A列对应行号的内容,公式右拉就是返回B列,C列,D列对应行号的内容。结果如下图所示。最后的错误值用iferror处理一下就可以了。

总的思路就是将满足条件的按列号乘以100再上行号的方式结合起来,然后用small依次提取第1,第2,第3,。。。第n个最小值,这样就是按列的方向提取最小值,间接的把部门相同的放在了一起;再下来就是从得到的最小值中取出行号,最后用index返回行列的内容。

文件链接:

https://pan.baidu.com/s/1WBkvEFxpoetrx9plh0pUrA

提取码:cm2h

(0)

相关推荐