一对多查询竟然有这么多方法,惊呆我了!
小伙伴们,大家好。今天继续来分享一对多查询的方法,还是昨天的案例。是在昨天思路的基础上通过其他函数来完成的,主要用到lookup+frequency+countif+offset这4个函数。countif和offset的多维引用得到了辅助列的结果,frequency像vlookup一样定位第1个1,第1个2的位置,lookup返回对应位置的姓名。
根据学历查询出所有的姓名
在G2单元格中输入公式=LOOKUP(,0/FREQUENCY(ROW(A1),COUNTIF(OFFSET(C$3,,,ROW($1:$12)),F$2)),A$3:A4)&"",不用三键,向下填充,完成。公式也不算太长。
=COUNTIF(OFFSET(C$3,,,ROW($1:$12)),F$2)这部分返回的结果如下图D列所示,实际就是昨天辅助列的效果,只不过现在形成了一个内存数组。
下面简单说一下offset的多维引用。我们一般引用区域的时候只引用一个区域,比如C3:C14;而offset的多维引用可以引用多个区域,比如OFFSET(C$3,,,ROW($1:$12))就引用了12个区域,第1个区域是C3:C3,第2个区域是C3:C4,第3个区域是C3:C5。。。第12个区域是C3:C14。
=FREQUENCY(ROW(A1),COUNTIF(OFFSET(C$3,,,ROW($1:$12)),F$2))这部分用frequency定位第1个1的位置,结果如下图E列所示,在D列第1个1的对应位置计数1,其他位置都为0。此时frequency的第1参数是1,在第2参数中第1个1的位置计数1。
=LOOKUP(,0/FREQUENCY(ROW(A1),COUNTIF(OFFSET(C$3,,,ROW($1:$12)),F$2)),A$3:A4)这部分用lookup返回第1个1对应的姓名“李凯凯”。其中lookup的第2参数如下图E列所示,也就是用0除以上一步frequency的结果,是0的变为错误值,1的变为0。lookup的第1参数啥也没写,用逗号隔开代表0,也就是在第2参数中查找0的位置,找到后返回第3参数中的姓名。lookup的第3参数A$3:A4和A3:A14是一样的效果,因为具有延展性,像sumif的第3参数一样。
上面lookup的公式就是G2单元格的公式,公式下拉到G3单元格变为=LOOKUP(,0/FREQUENCY(ROW(A2),COUNTIF(OFFSET(C$3,,,ROW($1:$12)),F$2)),A$3:A5),此时只有frequency的第1参数变为2,其他的都不变。就是用frequency定位第1个2的位置,结果如下图E列所示;然后用lookup返回这个位置对应的姓名“程昊”。
公式下拉到G4就用frequency定位第1个3的位置,然后用lookup返回对应的姓名“谢文燕”,和上面是一样的用法就不再重复说明。公式再下拉,到了G5的时候,此时所有大专对应的姓名都查询完了,它返回的结果是0,并且公式再下拉的话,返回的结果都是0,如下图所示。
为什么G5以后的单元格都是0呢?还得要看frequency,因为只有它的第1参数在变,G5的时候它的第1参数是4,在第2参数中找不到大于等于4的,所以在最后一个位置计数1,如上图E15所示,然后用lookup返回对应的A15单元格,而A15单元格是空单元格,所以显示为0。为了不让0显示出来,所以公式最后要连接空文本,也就是&""。
这种方法我认为还是很经典的,你怎么看?加上今天的方法,一对多查询的方法我应该分享过4-5种了,你学会了几种?如果你还有其他的方法,欢迎分享,让我们一起学习。
文件链接:
https://pan.baidu.com/s/1mrT0qa4VrzOs9wRH3qE3vQ
提取码:o7z0