多对多查询1:按数据源的顺序输出结果

1.查询出部门满足黄色区域这些条件的记录
如下图所示,F1:I1的黄色区域是条件,只要左表中的部门满足这些条件就查询出来,其实也就是筛选出来。结果的顺序还是按数据源的顺序。那这是怎么实现的?其实它和一对多查询的思路差不多,只不过是多增加了些条件。现在这个题目的多条件之间是或的关系,就可以用加号把多个条件加起来。
在F3单元格输入公式=IFERROR(INDEX(A:A,SMALL(IF(($B$3:$B$16=$F$1)+($B$3:$B$16=$G$1)+($B$3:$B$16=$H$1)+($B$3:$B$16=$I$1),ROW($3:$16)),ROW(A1))),""),按ctrl+shift+enter三键结束,向右向下填充。
不要看公式很长,其实是条件太多了。if的第1参数有4个条件,也就是=($B$3:$B$16=$F$1)+($B$3:$B$16=$G$1)+($B$3:$B$16=$H$1)+($B$3:$B$16=$I$1)这部分,返回的结果如下图E列所示。意思是B列的部门等于F1或等于G1或等于H1或等于I1,只要满足了其中1个条件就成立。现在黄色区域的条件中只有生产部和人事部,所以B列的部门中只要是生产部和人事部的就成立,对应的数字是1。然后返回对应的行号,用一对多查询的思路完成就可以了。
因为每个条件都要加一下,所以公式会很长。这时我们可以用mmult来代替完成。在F3单元格输入公式=IFERROR(INDEX(A:A,SMALL(IF(MMULT(N($B$3:$B$16=$F$1:$I$1),{1;1;1;1}),ROW($3:$16)),ROW(A1))),""),按三键结束,向右向下填充。
mmult返回的结果和上面多个条件相加的结果是一样的,只不过条件多的话,可以用mmult简化公式。先来看mmult的第1参数N($B$3:$B$16=$F$1:$I$1),就是用B列的部门和黄色区域的条件进行相等的比较,相等的返回true,不相等的返回false。然后用n函数把true转为1,false转为0。结果如下图所示。
然后用mmult对第1参数每一行的值求和,所以第2参数为纵向的4个1,也就是{1;1;1;1}。MMULT(N($B$3:$B$16=$F$1:$I$1),{1;1;1;1})返回的结果如下图绿色部分所示。还是生产部和人事部的返回1,其他的返回0。也可以参考第2图。
当我在G1单元格选择财务部的时候,B列中的财务部也符合条件,所以E列中对应的结果就是1。然后让条件成立的返回对应的行号,再用small提取出每个行号,用index返回对应的内容就可以了。这个我就不再详细说明了,大家参考一对多查询。
今天的查询结果是按数据源的顺序输出的,那如何按条件的顺序输出结果呢?如下图一样,第1个条件是生产部,先把所有生产部的查询出来;第2个条件是销售部,紧接着把所有销售部的查询出来;其他的以此类推。这个功能我认为还挺有用的,下次来说它是怎么实现的,大家也可以先想一想。
文件链接:
https://pan.baidu.com/s/1zxyxHB3RMTrBuJAjU86u_w
提取码:sndu
(0)

相关推荐