多条件计数,你用countifs还是sum?
下图是某公司部分员工的信息表,现在要统计出出生于20世纪八九十年代且已有职位的人数。简单来说就是出生于1980~1999年之间,且职位不为空的人数。结果是3,也就是绿色标出的那3个人。如何用函数算出结果?
1.sum多条件计数(一维数组间的运算)
先说下思路,首先从所有人的身份证号中提取出出生年份,然后判断这些年份是否在1980~1999这个范围内,这是第1个条件。同时还要判断职位是否不为空,这是第2个条件。把同时满足这2个条件的统计出来就可以了。
=SUM((--MID(C3:C17,7,4)>=1980)*(--MID(C3:C17,7,4)<=1999)*(E3:E17<>""))
MID(C3:C17,7,4)这部分用mid从身份证号中将出生年份提取出来。从第7位开始提取,提取的长度是4位。
mid提取出来的年份是文本,--MID(C3:C17,7,4)这部分通过减负运算将文本转为数值。
然后让其大于等于1980且小于等于1999,满足年代的条件。因为年代这个条件在一个区间范围,所以相当于同时满足2个条件,2个条件之间相乘。
接下来还得让职位不等于空,也就是(E3:E17<>"")这部分。最后让这3部分相乘,同时满足的返回1,有一个不满足的返回0。用sum求和就得到了想要的结果。
=SUM((MID(C3:C17,7,3)>="198")*(MID(C3:C17,7,3)<="199")*(E3:E17<>""))
此时二十世纪八、九十年代分别用198和199来表示,也就是只要年份的前3位数。当然,从身份证号中也只提取年份的前3位数。然后像之前那样条件判断,相乘求和,结果是一样的。
想要用countifs,条件区域必须是单元格引用,不能是数组。所以身份证号的区域是必须要用的,而它对应的条件又是年代,看起来不是很匹配。其实它们之间存在包含的关系,身份证号中包含年代。可以用通配符的方法来完成。输入下面的公式:
=SUM(COUNTIFS(C3:C17,"??????19"&{8,9}&"*",E3:E17,"<>"))
3.sum多条件计数(方向不同的一维数组的运算)
=SUM((MID(C3:C17,7,3)=19&{8,9})*(E3:E17<>""))
MID(C3:C17,7,3)这部分从身份证号中取出年份的前3位,得到了一个纵向一维数组。19&{8,9}返回的结果为{"198","199"},得到了一个横向的一维数组。
MID(C3:C17,7,3)=19&{8,9}这两部分进行相等的比较,返回的结果是一个二维数组。因为方向不同的一维数组的运算,结果会形成二维数组。
E3:E17<>""这部分判断职位不等于空,返回一个由逻辑值true和false组成的纵向一维数组。
(MID(C3:C17,7,3)=19&{8,9})*(E3:E17<>"")这两部分相乘是二维数组和一维数组的运算,得到的结果还是二维数组。最后用sum求和得到想要的结果。
https://pan.baidu.com/s/1rfohMOgsepp9wJj1PQX1PQ