上次讲了如何使用IF和CHOOSE配合VLOOKUP实现反向VLOOKUP。
然而,挤牙膏不是我的专长。 今天,我们来盘点一下EXCEL中常用的数据查询方法。
假设场景
为何更好展现这些查询方法,我们不妨设想一个场景
假如我有如下的一张表,需要快速地找到所有姓赵的学生的成绩
为了获得姓赵的所有学生的成绩,我们需要用怎么样的逻辑来完成呢?
- 直觉告诉我,首先我需要获得所有同学的姓氏
- 接着,我应该很自然地把姓赵的同学筛选出来
- 最后,我便可从容不迫地匹配出所需的同学的成绩
在开始具体实现之前,我们还需要注意,实现这件事方法有很多,但是怎样的方法才是合适的,才是符合需求的
- 比如,今天需要姓赵同学,明天你是否又需要姓李的同学的成绩,或者其他某个姓氏的成绩了呢
- 比如,如今你的表中有几十个人,明天你是否需要从全校的几千人中查询
如果需求简单,复杂的方法反而浪费时间
如果需求复杂,完善的方法可以让你事半功倍
接下来,我们就来看看,简单可以有多么简单,复杂又可以有多么复杂,他们适用的场景又有什么不同
极致简单版
1.获得所有同学的姓氏
在不考虑复姓的前提下,获得姓名中的姓氏,不要太简单哦!
这里提供两种方法:
- 分列
是EXCEL最常用的拆分方法,可以将一列文本,按照一定的规则,拆成几列。
- MID函数
相比于分列,我更喜欢MID
MID可以对字符进行拆分,取出中间任意几个字符
MID("ABC", 1, 2)
# 从ABC这个字符串的第1个字符开始,取出2个字符
# 结果为 AB
比如,如果要取出同学姓名中的姓氏,MID(同学姓名,1,1)
就可以了
2. 筛选学生和成绩
有了姓氏,接着我们需要把某个姓氏的同学都挑选出来
同样提供两个操作,筛选和切片器
-
筛选
EXCEL中用于数据查询最最常见的功能
反正姓都有了,直接对姓氏那一列筛选就OK了。相信你懂的(  ̄ー ̄)
切片器
切片器就是成了仙的筛选,真正做到了哪里要看点哪里
只要将表格格式化或者使用pivot table,就可以轻松使用切片器,让你的筛选变成指尖愉快的单击。
极致复杂版
快乐的时光总是那么短暂,接下来,我们来搞点烧脑的东西。
本段内容如果催眠,那就来瓶脉动吧!重新脉动起来(脉动可以考虑适当赞助)
EXCEL中什么最复杂,那自然是公式啊
EXCEL中什么公式最复杂,那自然是嵌套公式啊
如果我们要使用公式来解决这个问题,那么问题的复杂程度的陡然上升。
这时,有人就要问了,既然我有简单的方式,为什么要反过来使用复杂的呢?
行为艺术吗?
行为艺术自然是没有必要的,复杂的公式自然有其优势,比如
- 简单法需要添加一列姓氏辅助列,会在原表格上添加冗余数据
- 简单法只能筛选数据,得到数据还需要把内容复制出来
- 无论是删选,还是切片器,如果全校有几千个人,百家姓都在,那么使用起来其实是比较麻烦的
如果用公式法,一定程度上可以解决以上问题!
在公式法中,这是一个典型的一对多筛选问题(利用一个姓筛选多行数据)
也是EXCEL各路函数争奇斗艳,施展灵魂操作的地方
争奇斗艳者
- 神奇的数组函数
EXCEL可以处理单个值的计算,也可以处理一个序列。
即,你输入一个序列,他对里面每一个元素运算,然后再输出一列结果
- 优雅的Match
Match("C", {"A","B", "C", "D"})
# 在序列中搜寻C,输出找到的位置
# 即 3
- 精准的INDEX
INDEX({"A","B","C", "D"},3)
# 在序列中找到位置为3的值,输出
# 即 C
- 深藏不漏的IF
IF配合数组函数,可以实现1对多的查询
IF({"A","B","C","D"} = "C", {1,2,3,4},0)
# ABCD对应1234
# 将序列中的每一个值与C比较,如果相等,输出对应的值,反之输出0
# {0,0,3,0}
技术路线
而利用以上的函数,我们又有两条技术路线可以尝试:
- 路线1
使用IF直接获得比较每一个名字的姓是否是赵,如果是,可以获得对应的行号,获得行号后就可以使用INDEX函数来获取姓名列和成绩列的值了
示意图如下
- 路线2
第二种操作就很有趣了,我们可以通过一些手段,将一对多问题,转化为一对一问题,然后使用MATCH处理。
示意图如下
具体实现
能看到这里的小伙伴一定是真爱, 给你们比心!
由于具体实现比较复杂,我很难在有效的篇幅内讲清,所以这里只能意思一下!
想深入了解的读者可以在文末获取一个EXCEL文件,自己试验一下。
- 路线1
#Name
=IFERROR(INDEX(A$1:A$17,SMALL(IF(N$2=MID(A$1:A$17,1,1),ROW(A$1:A$17),""),ROW(A$1:A$17))),"-")
#SCORE
=IFERROR(INDEX(B$1:B$17,SMALL(IF(N$2=MID(A$1:A$17,1,1),ROW(A$1:A$17),""),ROW(A$1:A$17))),"-")
- 路线2
#Name
=IFERROR(INDEX(A1:A17,SMALL(IFERROR(MATCH(O2&ROW(A1:A17),MID(A1:A17,1,1) & ROW(A1:A17),0),""),ROW(A1:A17))),"-")
#SCORE
=IFERROR(INDEX(B1:B17,SMALL(IFERROR(MATCH(O2&ROW(A1:A17),MID(A1:A17,1,1) & ROW(A1:A17),0),""),ROW(A1:A17))),"-")
尾声
国庆,中秋,已然结束啦,祝大家在接下的学习与工作,一切顺利。
EXCEL文件获取方式:后台回复
EasyCEL
肖恩
2020.10