ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5120|回复: 18

[分享] 一题多解之两表条件汇总:MMULT与SUMIFS+COUNTIFS的对抗

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-12-15 22:37 | 显示全部楼层 |阅读模式
经常碰到两个表格进行条件汇总或计算,而且通常一个表是另一个表条件,需通过一个表为条件去查找另一个表数据,然后再进行汇总。
表一(车辆出勤记录):

日期
车牌号码
车型类别
实际载重(吨)
行驶公里数(公里)
2012-2-1
粤 12XXX
B1类
5
500
2012-10-1
粤 13XXX
B1类
6
500
2012-10-11
粤 16XXX
A1类
20
200
2013-6-12
粤 22XXX
C2类
4
400
2013-9-1
粤 23XXX
B2类
5
500
2013-9-13
粤 33XXX
A2类
22
300
2013-10-16
粤 15XXX
A6类
28
400
2014-1-1
粤 18XXX
B1类
3
300
2014-2-4
粤 17XXX
C1类
7
700
2014-3-1
粤 22XXX
C2类
5
500
2014-4-2
粤 23XXX
B2类
2
200
2014-5-6
粤 17XXX
C1类
5
500
2014-6-6
粤 16XXX
A1类
22
300
2014-7-7
粤 33XXX
A2类
22
500
2014-8-12
粤 28XXX
A3类
21
400
2014-9-12
粤 27XXX
A4类
25
300
2012-10-15
粤 36XXX
A6类
26
600
2014-11-15
粤 26XXX
A6类
25
500
2014-12-25
粤 15XXX
A6类
23
700


表二(车辆参数表):

车型类别
额定载重(吨)
是否挂车
B1类
8
C1类
6
C2类
7
B2类
9
A1类
25
A2类
26
A3类
27
A4类
28
A5类
29
A6类
30


需要求助是:

年度
额定载重(吨)
挂车行驶公里数(公里)
2012
 
 
2013
 
 
2014
 
 


注:该数据是根据:http://club.excelhome.net/thread-1166007-1-1.html  修改转变而来。
依据条件及求的内容.png

车辆载重量及公里数.zip

30.18 KB, 下载次数: 117

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-15 22:43 | 显示全部楼层
本帖最后由 dengjq2000 于 2015-4-1 09:51 编辑

方法一:辅助列

碰到这样的问题,如果通过辅助列,解决起来也相对比较方便。
如附件的工作表:“方法一辅助列”通过辅助列O列公式:
  1. =VLOOKUP($E5,$I:$K,COLUMN(B$1),)
复制代码

往下拉,进行对“额定载重(吨)”的查找;通过辅助列P列公式:
  1. =VLOOKUP($E5,$I:$K,COLUMN(C$1),)
复制代码

往下拉,来进行对“是否挂车”的判断。
然后通过公式,单元格T2公式:
  1. =SUMPRODUCT((YEAR(C$5:C$23)=S4)*O$5:O$23)
复制代码
往下拉

以及单元格U2公式:
  1. =SUMPRODUCT((YEAR(C$5:C$23)=S4)*(P$5:Q$23="是")*G$5:G$23)
复制代码
往下拉,便可很轻松完成。




方法一.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-15 22:57 | 显示全部楼层
方法二:MMULT函数
通常碰到这样的问题,如果不借用辅助列来实现。首先想到就应该是:MMULT函数了。
单元格T2数组公式(数组公式确认需同时按:CTRL + SHIFT + ENTER 三键确认才有效):
  1. =SUMPRODUCT((YEAR(C$5:C$23)=S4)*(MMULT(--(E$5:E$23=TRANSPOSE(I$5:I$14)),J$5:J$14)))
复制代码
单元格U2数组公式:
  1. =SUMPRODUCT((YEAR(C$5:C$23)=S4)*(MMULT(--(E$5:E$23=TRANSPOSE(I$5:I$14)),N(K$5:K$14="是")))*G$5:G$23)
复制代码
往下拉,便可实现。

现在主要来分析一下上面数组公式运算机理。
一、数组公式:=SUMPRODUCT((YEAR(C$5:C$23)=S4)*(MMULT(--(E$5:E$23=TRANSPOSE(I$5:I$14)),J$5:J$14))) 运算机理分析
1、TRANSPOSE(I$5:I$14)   目的就是为了转置。行排放变成列排放
选择一个一行十列单元格区域,然后把公式:TRANSPOSE(I$5:I$14) 进行CTRL + SHIFT + ENTER 三键确认,就会列出:

B1类
C1类
C2类
B2类
A1类
A2类
A3类
A4类
A5类
A6类


2、MMULT(--(E$5:E$23=TRANSPOSE(I$5:I$14)),J$5:J$14) ,实现了方法一辅助列当中O列的目的

3、=SUMPRODUCT((YEAR(C$5:C$23)=S4)*(MMULT(--(E$5:E$23=TRANSPOSE(I$5:I$14)),J$5:J$14)))
上述第2点理解好了,接下来就是挺简单的单元格求和罢了。

二、数组公式:=SUMPRODUCT((YEAR(C$5:C$23)=S4)*(MMULT(--(E$5:E$23=TRANSPOSE(I$5:I$14)),N(K$5:K$14="是")))*G$5:G$23)  运算机理分析
这数组公式与上面数组(即T列)运算机理一样,只是注意一下,对于条件判断需通过进行1与0转换
方法二.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-15 23:12 | 显示全部楼层
方法三:SUMIFS与COUNTIFS

方法三:SUMIFS与COUNTIFS才是重头戏。在EXCEL 2007版本增加了新函数当中就是有SUMIFS与COUNTIFS这两个函数。他们在解决多工作表多条件汇总与计数上实现飞跃。可以查阅主题:多工作表两(多)条件汇总  与 多工作表两(多)条件计数-COUNTIFS函数 解决了在EXCEL 2003实现的困惑。
在这里又要让SUMIFS与COUNTIFS这两个函数体现其独特的一面(详见可见主楼附件的工作表:方法三SUMIFS COUNTIFS)。
单元格T2公式:
  1. =SUMPRODUCT(COUNTIFS(C$5:C$23,">="&DATE(S4,1,1),C$5:C$23,"<"&DATE(S4+1,1,1),E$5:E$23,$I$5:$I$14)*J$5:J$14)
复制代码
单元格U2数组公式:
  1. =SUMPRODUCT(SUMIFS(G$5:G$23,C$5:C$23,">="&DATE(S4,1,1),C$5:C$23,"<"&DATE(S4+1,1,1),E$5:E$23,$I$5:$I$14)*IF(K$5:K$14="是",1,))
复制代码
或:
  1. =SUMPRODUCT(SUMIFS(G$5:G$23,C$5:C$23,">="&DATE(S4,1,1),C$5:C$23,"<"&DATE(S4+1,1,1),E$5:E$23,$I$5:$I$14)*N(K$5:K$14="是"))
复制代码
让问题实现如果方便,也让MMULT函数怀恨在心了。

现在分析这两个公式(数组公式)运算机理。
一、公式:=SUMPRODUCT(COUNTIFS(C$5:C$23,">="&DATE(S4,1,1),C$5:C$23,"<"&DATE(S4+1,1,1),E$5:E$23,$I$5:$I$14)*J$5:J$14) 运算逻辑分析
1、COUNTIFS(C$5:C$23,">="&DATE(S4,1,1),C$5:C$23,"<"&DATE(S4+1,1,1),E$5:E$23,$I$5:$I$14)   目的就是分别以:
“车辆参数表”的第一列“I列车型类别”为条件对“原表”的第三列(E列车型类别),以及“原表”第一列(C列日期)分年度段为条件进行计数
2、=SUMPRODUCT(COUNTIFS(C$5:C$23,">="&DATE(S4,1,1),C$5:C$23,"<"&DATE(S4+1,1,1),E$5:E$23,$I$5:$I$14)*J$5:J$14) 理解第1点,接下来就单条求和了





方法三_01.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-15 23:15 | 显示全部楼层
二、公式:=SUMPRODUCT(SUMIFS(G$5:G$23,C$5:C$23,">="&DATE(S4,1,1),C$5:C$23,"<"&DATE(S4+1,1,1),E$5:E$23,$I$5:$I$14)*IF(K$5:K$14="是",1,)) 运算机理分析
1、SUMIFS(G$5:G$23,C$5:C$23,">="&DATE(S4,1,1),C$5:C$23,"<"&DATE(S4+1,1,1),E$5:E$23,$I$5:$I$14)   目的就是分别以:
“车辆参数表”的第一列“I列车型类别”为条件对“原表”的第三列(E列车型类别),以及“原表”第一列(C列日期)分年度段为条件对“原表”的第五列[G列行驶公里数(公里)]进行汇总

2、=SUMPRODUCT(SUMIFS(G$5:G$23,C$5:C$23,">="&DATE(S4,1,1),C$5:C$23,"<"&DATE(S4+1,1,1),E$5:E$23,$I$5:$I$14)*IF(K$5:K$14="是",1,)) 进行条件判断,当是否挂车为“是”则为 1 提出数值汇总,否则为 0 不提出该数值
方法三_02.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-15 23:42 | 显示全部楼层
方法四:SQL语句+数据透视表

SQL语句为:
  1. select 日期,IIF(是否挂车="否",0,`行驶公里数(公里)`),`额定载重(吨)` from
  2. (select A.日期,A.车型类别,A.`行驶公里数(公里)`,B.`额定载重(吨)`,B.是否挂车 from
  3. (select YEAR(日期) as 日期,车型类别,`行驶公里数(公里)` from [数据源$C4:G] where not isnull(车型类别))A
  4. left join
  5. (select * from [数据源$I4:K])B
  6. on A.车型类别=B.车型类别)
复制代码
分析该SQL语句:

select 日期,IIF(是否挂车="否",0,`行驶公里数(公里)`),`额定载重(吨)` from
(select A.日期,A.车型类别,A.`行驶公里数(公里)`,B.`额定载重(吨)`,B.是否挂车 from
(select YEAR(日期) as 日期,车型类别,`行驶公里数(公里)` from [数据源$C4:G] where not isnull(车型类别))A
left join
(select * from [数据源$I4:K])B
on A.车型类别=B.车型类别)
第一层:
select A.日期,A.车型类别,A.`行驶公里数(公里)`,B.`额定载重(吨)`,B.是否挂车 from
(select YEAR(日期) as 日期,车型类别,`行驶公里数(公里)` from [数据源$C4:G] where not isnull(车型类别))A
left join
(select * from [数据源$I4:K])B
on A.车型类别=B.车型类别
目的就是实现以“车型类别”桥梁对表一进行添加列。

执行SQL语句后,运行的结果是:
日期
车型类别
行驶公里数(公里)
额定载重(吨)
是否挂车
2012
B1类
500
8
2012
B1类
500
8
2012
A1类
200
25
2013
C2类
400
7
2013
B2类
500
9
2013
A2类
300
26
2013
A6类
400
30
2014
B1类
300
8
2014
C1类
700
6
2014
C2类
500
7
2014
B2类
200
9
2014
C1类
500
6
2014
A1类
300
25
2014
A2类
500
26
2014
A3类
400
27
2014
A4类
300
28
2012
A6类
600
30
2014
A6类
500
30
2014
A6类
700
30



第二层:
select 日期,IIF(是否挂车="否",0,`行驶公里数(公里)`),`额定载重(吨)` from
(select A.日期,A.车型类别,A.`行驶公里数(公里)`,B.`额定载重(吨)`,B.是否挂车 from
(select YEAR(日期) as 日期,车型类别,`行驶公里数(公里)` from [数据源$C4:G] where not isnull(车型类别))A
left join
(select * from [数据源$I4:K])B
on A.车型类别=B.车型类别) 目的就是对是否挂车为“否”进行赋值为 0
执行SQL语句后,运行的结果是:
日期
Expr1001
额定载重(吨)
2012
0
8
2012
0
8
2012
200
25
2013
0
7
2013
0
9
2013
300
26
2013
400
30
2014
0
8
2014
0
6
2014
0
7
2014
0
9
2014
0
6
2014
300
25
2014
500
26
2014
400
27
2014
300
28
2012
600
30
2014
500
30
2014
700
30

第一层SQL语句效果.png
第二层.png
导入数据时选项.png
方法四SQL语句+数据透视表.gif

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-15 23:50 | 显示全部楼层
方法五:直接用SQL语句一气呵成
SQL语句:
  1. select 日期,sum(`额定载重(吨)` ) as `额定载重(吨)`,sum(行驶公里数) as `行驶公里数(公里)` from (select 日期,IIF(是否挂车="否",0,`行驶公里数(公里)`) as 行驶公里数,`额定载重(吨)` from
  2. (select A.日期,A.车型类别,A.`行驶公里数(公里)`,B.`额定载重(吨)`,B.是否挂车 from
  3. (select YEAR(日期) as 日期,车型类别,`行驶公里数(公里)` from [数据源$C4:G] where not isnull(车型类别))A
  4. left join
  5. (select * from [数据源$I4:K])B
  6. on A.车型类别=B.车型类别)) group by 日期
复制代码
中间两层已经方法四:SQL语句+数据透视表 进行了分析,不在分析。
对最外层进行分析:
select 日期,sum(`额定载重(吨)` ) as `额定载重(吨)`,sum(行驶公里数) as `行驶公里数(公里)` from (select 日期,IIF(是否挂车="否",0,`行驶公里数(公里)`) as 行驶公里数,`额定载重(吨)` from
(select A.日期,A.车型类别,A.`行驶公里数(公里)`,B.`额定载重(吨)`,B.是否挂车 from
(select YEAR(日期) as 日期,车型类别,`行驶公里数(公里)` from [数据源$C4:G] where not isnull(车型类别))A
left join
(select * from [数据源$I4:K])B
on A.车型类别=B.车型类别)) group by 日期

目的就是以日期分类进行对:额定载重(吨)行驶公里数 进行汇总。


SQL语句效果.png
方法五SQL语句.gif

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-15 23:53 | 显示全部楼层
邀请:
希望这主题跟一部分人有所帮助,同时希望有其他方法解决的朋友,请亮出您的公式。好的跟帖子将给予一定财富或技术分的奖励(暂不对VBA跟帖进行评价)。谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-15 23:55 | 显示全部楼层
本帖最后由 dengjq2000 于 2017-11-24 08:15 编辑

该主题对论坛求助主题的帮助或借鉴的有:
注意:
主楼的附件当中的工作表:“方法一辅助列”的单元格U4公式应该为:

=SUMPRODUCT((YEAR(C$5:C$23)=S4)*(P$5:Q$23="是")*G$5:G$23)

1、不增加行或列的求和公式,求指导

2、多单元格混合运算         4楼

3、检索所需数据并提取

4、销量的各种情况,求各店最多

5、运用公式根据生产计划和BOM表计算物料的当天、班需求

6、不借助辅助列多条件求和。被求和对象有一定条件限制

7、考勤统计,多种考勤符号

8、用什么函数统计







TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-16 07:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
同时把SUMPRODUCT函数关于 *, 一点区别一起共享大家
2014-12-16_074832.png

SUMPRODUCT.zip

8.57 KB, 下载次数: 23

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-20 17:40 , Processed in 0.059992 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表