欢迎转发和点一下“在看”,文末留言互动!
置顶公众号或设为星标及时接收更新不迷路
小伙伴们好,今天来和大家分享一道按条件统计数量的题目。题目稍稍有些难,今天介绍了两种方法,从不同的角度、不同的逻辑思路和不同的函数选择详细介绍了解题的过程。
原题目是下面这样子:
题目给了一个示例。丁公司每周都售卖商品,在星期五这天一共有三种商品售卖。所以丁公司最多销售的货品种类是3样。
朋友们,你们有什么好的方法吗?
01
MMULT函数法,但要借COUNTIF函数处理重复值
这其实就是一个多条件去重求统计数量的题目。
在单元格F2中输入下列公式,三键确认后向下拖曳即可。
=MAX(MMULT(SIGN(TRANSPOSE(IFERROR(FIND(COLUMN($A:$G),($A$2:$A$12=E2)*$C$2:$C$12),0))),ROW($1:$11)^0))-(COUNTIF($A$2:$A$12,E2)-SUM((1/COUNTIF($B$2:$B$12,$B$2:$B$12))*($A$2:$A$12=E2)))
这条公式比较长,利用的MMULT函数矩阵求和,以及COUNTIF函数统计不重复数量。
FIND(COLUMN($A:$G),($A$2:$A$12=E2)*$C$2:$C$12)
源数据C列中的数据全部都是由1-7这几个数字构成的。首先利用FIND函数,在符合当前条件的源数据中,查找一下1-7这几个数字。
由于后面要使用到MMULT函数,所以这里使用的COLUMN($A:$G),结果是一个矩阵形式的内存数组。
IFERROR(FIND(COLUMN($A:$G),($A$2:$A$12=E2)*$C$2:$C$12),0)
利用IFERROR函数将错误值都替换为0。完成后这部分的结果是{1,2,3,4,0,0,0;0,0,0,0,0,0,0;0,0,0,0,0,0,0;0,0,0,0,0,0,0;0,0,0,0,0,0,0;0,0,0,0,0,0,0;0,0,0,0,0,0,0;0,0,0,0,0,0,0;0,0,0,0,1,2,3;0,0,0,0,0,0,0;0,0,0,0,0,0,0},这是一个11行7列的内存数组。
这个结果的含义是,每行的“允许销售周期”在一周七天内每天被FIND函数查找的结果。这个不是我们需要的结果。我们希望得到的结果是,在同一天内,有多少公司的“允许销售周期”被查找到。
TRANSPOSE(IFERROR(FIND(COLUMN($A:$G),($A$2:$A$12=E2)*$C$2:$C$12),0))
利用TRANSPOSE函数进行转置。转置结果是{1,0,0,0,0,0,0,0,0,0,0;2,0,0,0,0,0,0,0,0,0,0;3,0,0,0,0,0,0,0,0,0,0;4,0,0,0,0,0,0,0,0,0,0;0,0,0,0,0,0,0,0,1,0,0;0,0,0,0,0,0,0,0,2,0,0;0,0,0,0,0,0,0,0,3,0,0}。
SIGN(TRANSPOSE(IFERROR(FIND(COLUMN($A:$G),($A$2:$A$12=E2)*$C$2:$C$12),0)))
利用SIGN函数将数组中的正数都转换为1。
MMULT(SIGN(TRANSPOSE(IFERROR(FIND(COLUMN($A:$G),($A$2:$A$12=E2)*$C$2:$C$12),0))),ROW($1:$11)^0))
利用MMULT函数矩阵求和。结果为{1;1;1;1;1;1;1}。
MAX(MMULT(SIGN(TRANSPOSE(IFERROR(FIND(COLUMN($A:$G),($A$2:$A$12=E2)*$C$2:$C$12),0))),ROW($1:$11)^0))
MAX函数找出最大值。
但由于源数据中有重复值,我们还要考虑处理一下。
COUNTIF($A$2:$A$12,E2)
利用COUNTIF函数求得当前公式在源数据中的个数。
SUM((1/COUNTIF($B$2:$B$12,$B$2:$B$12))*($A$2:$A$12=E2))
这部分是求不重复数据个数的经典公式。
(COUNTIF($A$2:$A$12,E2)-SUM((1/COUNTIF($B$2:$B$12,$B$2:$B$12))*($A$2:$A$12=E2)))
两者相减便是重复数据的个数。
MAX(MMULT(SIGN(TRANSPOSE(IFERROR(FIND(COLUMN($A:$G),($A$2:$A$12=E2)*$C$2:$C$12),0))),ROW($1:$11)^0))-(COUNTIF($A$2:$A$12,E2)-SUM((1/COUNTIF($B$2:$B$12,$B$2:$B$12))*($A$2:$A$12=E2)))
最后将三部分合在一起,就是最终的答案了。
02
利用MATCH函数来简化公式
上面的公式有些复杂了。我们可以尝试着简化一下公式。
在单元格F2中输入下列公式,三键确认后向下拖曳即可。
=MAX(MMULT(--TRANSPOSE(MATCH(B$2:B$12,B:B,)=ROW($2:$12)),1-ISNA(MATCH(E2&B$2:B$12&"*"&COLUMN(A:G)&"*",A$2:A$12&B$2:B$12&C$2:C$12,))))
这条公式则是利用的MMULT函数和MATCH函数来解决问题的。
MATCH(B$2:B$12,B:B,)=ROW($2:$12)
利用MATCH函数返回品名在B列中的位置,并且和ROW($2:$12)比较。
--TRANSPOSE(MATCH(B$2:B$12,B:B,)=ROW($2:$12))
利用TRANSPOSE函数转置后再减负运算。实际上,实现了去重的目的。这部分的结果为{1,1,1,1,1,1,1,1,1,1,0},你看,最后一个“0”就表示重复值已经被屏除了。
MATCH(E2&B$2:B$12&"*"&COLUMN(A:G)&"*",A$2:A$12&B$2:B$12&C$2:C$12,)
再次利用MATCH函数。这一次查找值是E2&B$2:B$12&"*"&COLUMN(A:G)&"*",是一组由不同字符组成的一个11行7列的内存数组。
我们以丁公司为例,查找值是下面这样的:
而查找区域则是这样的:
而MATCH函数返回的结果是:
1-ISNA(MATCH(E2&B$2:B$12&"*"&COLUMN(A:G)&"*",A$2:A$12&B$2:B$12&C$2:C$12,))
上面这部分则是把错误值转换为“0”,数值转换为“1”。结果如下:
MMULT(--TRANSPOSE(MATCH(B$2:B$12,B:B,)=ROW($2:$12)),1-ISNA(MATCH(E2&B$2:B$12&"*"&COLUMN(A:G)&"*",A$2:A$12&B$2:B$12&C$2:C$12,)))
利用MMULT函数矩阵求和。结果是{1,1,1,2,3,1,1}。
MAX(MMULT(--TRANSPOSE(MATCH(B$2:B$12,B:B,)=ROW($2:$12)),1-ISNA(MATCH(E2&B$2:B$12&"*"&COLUMN(A:G)&"*",A$2:A$12&B$2:B$12&C$2:C$12,))))
最后MAX函数返回大值即可。
本期内容练习文件提取方式:
链接: https://pan.baidu.com/s/1ElghM9rxTFAn8WfOdy3ZuA?pwd=ip2f 提取码: ip2f
-END-
长按下方二维码关注EXCEL应用之家
面对EXCEL操作问题时不再迷茫无助
我就知道你“在看”