前几天刚说FREQUENCY函数是多条件去重统计No.1,MMULT函数就来贡献名称面!

文摘   2024-11-15 20:00   上海  




欢迎转发和点一下“看”,文末留言互动!

置顶公众号或设为星标及时接收更新不迷路





小伙伴们好,今天来和大家分享一道按条件统计数量的题目。题目稍稍有些难,今天介绍了两种方法,从不同的角度、不同的逻辑思路和不同的函数选择详细介绍了解题的过程。

原题目是下面这样子:




题目给了一个示例。丁公司每周都售卖商品,在星期五这天一共有三种商品售卖。所以丁公司最多销售的货品种类是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},这是一个117列的内存数组。

这个结果的含义是,每行的“允许销售周期”在一周七天内每天被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)&"*",是一组由不同字符组成的一个117列的内存数组。

我们以丁公司为例,查找值是下面这样的:




而查找区域则是这样的:




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操作问题时不再迷茫无助


我就知道你“在看”


推荐阅读

Excel应用之家
介绍、交流EXCEL各项功能在工作中的实际应用; 为你答疑解惑;分享各类图表、表格和模板;提供有偿代工服务。
 最新文章