2.3 条件求和
对分类事物的数量求和是一项重要的统计工作。在Excel中,按一定条件求和是一件非常容易的事情。Excel可以助统计工作一臂之力。
2.3.1 单条件求和
顾名思义,按一个条件求和,则为单条件求和。
例2-14 4名销售员的销售业绩如表2-6所示,如何分别按销售员和日期统计保险单数和保费?
表2-6 4名销售员的销售业绩
解题思路1:在Excel中,条件求和的函数有很多,但针对单条件求和的函数只有SUMIF函数。本题只有一个条件,可以用SUMIF函数求和。当然,多条件求和函数也可以用于单条件求和。至于单条件计数,当然用COUNTIF函数了。
解题过程:建立统计表,定义名称,为第一个统计表输入函数公式,为第二个统计表输入函数公式,使用格式刷。
(1)建立统计表。在文件“第2章统计表.xlsx”的“条件求和”工作表中,对“车险销售情况表”“SUMIF函数条件求和1”“SUMIF函数条件求和2”3个表录入相关数据。后2个表是分别按销售员和日期建立的统计表,如图2-64所示(隐藏了部分行)。
图2-64 建立单条件求和统计表
(2)定义名称。本例日期较多,拟用函数公式提取不重复日期。为简化公式,同时让数据可以动态增加,先定义一个名称“date”。操作过程为:
➊ 单击“公式”选项卡。
➋ 在“定义的名称”组中单击“定义名称”按钮。
➌ 在弹出的“新建名称”对话框的“名称”框中输入“date”。
➍ 在“引用位置”引用框中输入公式“=OFFSET($A$2,1,,COUNT($A:$A)-2,)”。
➎ 单击“确定”按钮,完成设置。
操作过程如图2-65所示。
图2-65 定义名称“date”
(3)为第一个统计表输入函数公式。
在G3单元格输入函数公式“=COUNTIF($B$3:$B$32,$F3)”。
在H3单元格输入函数公式“=SUMIF($B$3:$B$32,$F3,$D$3:$D$32)”。
在G7单元格输入函数公式“=SUM(G3:G6)”。
将G3:H3区域的公式向下填充至H6单元格,将G7单元格的公式向右填充至H7单元格。
结果如图2-66所示。
图2-66 按销售员统计的结果
(4)为第二个统计表输入函数公式。
在G11单元格输入函数公式“=SUM(G12:G32)”。
在F12单元格输入数组公式“{=IF(ROW(1:1)>SUM(1/COUNTIF(date,date)),"",INDEX(date,SMALL(IF(MATCH(date,date,)=ROW(date)-2,ROW(date)-2),ROW(1:1))))}”。
在G12单元格输入函数公式“=COUNTIF(date,F12)”。
在H12单元格输入函数公式“=SUMIF(date,F12,$D$3:$D$32)”。
将G11单元格的公式向右填充至H11单元格。将F12:H12区域的公式向下填充至需要的地方,例如H32单元格。
结果如图2-67所示。
图2-67 按日期统计的结果
(5)使用格式刷。操作过程为:
➊ 单击A列日期列的任意单元格,例如A12单元格。
➋ 单击“开始”选项卡。
➌ 在“剪贴板”组中单击“格式刷”按钮。
➍ 拖动鼠标刷过F12:F32区域。
操作过程及结果如图2-68所示。
图2-68 使用格式刷
【函数公式解析】
先解析名称“date”所使用的公式“=OFFSET($A$2,1,,COUNT($A:$A),)”。
式中,COUNT函数计算包含数字的单元格个数以及参数列表中数字的个数。
式中,OFFSET函数返回对单元格或单元格区域中指定行数和列数的区域的引用,该引用可以是单个单元格或单元格区域。其语法为:
OFFSET(reference, rows, cols, [height],[width])
reference(引用):必需,要以其为偏移量的底数的引用,引用必须是对单元格或相邻的单元格区域的引用,否则OFFSET返回错误值#VALUE!。
rows(行数):必需,需要左上角单元格引用的向上或向下行数,可为正数(这意味着在起始引用的下方)或负数(这意味着在起始引用的上方)。
cols(列数):必需,需要结果的左上角单元格引用的从左到右的列数,也可为正数(这意味着在起始引用的右侧)或负数(这意味着在起始引用的左侧)。
[height](高度):可选,为需要返回的引用的行高,必须为正数。
[width](宽度):可选,为需要返回的引用的列宽,必须为正数。如果rows和cols的偏移使引用超出了工作表边缘,则OFFSET返回错误值#REF!。如果省略height或width,则假设其高度或宽度与reference相同。
本式,COUNT函数计算A列数字的个数为30,作为OFFSET函数偏移的高度。OFFSET函数实质返回是A3:A32区域的数据,依赖COUNT函数的计算结果而实现动态变化。
再解析H3单元格的公式“=SUMIF($B$3:$B$32,$F3,$D$3:$D$32)”。
式中,SUMIF函数对范围中符合指定条件的值求和。其语法为:
SUMIF(range,criteria,[sum_range])
range(区域):必需,根据条件进行计算的单元格的区域,每个区域中的单元格必须是数字或名称、数组或包含数字的引用,空值和文本值将被忽略。
criteria(条件):必需,用于确定对哪些单元格求和的条件,其形式可以为数字、表达式、单元格引用、文本或函数,如32、">32"、B5、"32"、"苹果"或TODAY()等;条件中还可以使用通配符,包括问号(?)和星号(*)。问号匹配任意单个字符,星号匹配任意一串字符,如果要查找实际的问号或星号,请在该字符前键入波形符(~)。
[sum_range](求和区域):可选,为要求和的实际单元格;如果省略此参数,Excel会对在range参数中指定的单元格(即应用条件的单元格)求和。
最后解析F12单元格的公式“{=IF(ROW(1:1)>SUM(1/COUNTIF(date,date)),"",INDEX(date,SMALL(IF(MATCH(date,date,)=ROW(date)-2,ROW(date)-2),ROW(1:1))))}”。
式中,MATCH函数在范围单元格中搜索特定的项,然后返回该项在此区域中的相对位置。其语法为:
MATCH(lookup_value,lookup_array,[match_type])
lookup_value(查找值):必需,要在lookup_array中匹配的值,可以为值(数字、文本或逻辑值)或对数字、文本或逻辑值的单元格引用。
lookup_array(查找区域):必需,要搜索的单元格区域。
match_type(搜索类型):可选,为数字-1、0或1;如果为1或省略,则查找小于或等于lookup_value的最大值,lookup_array参数中的值必须以升序排序;如果为0,则查找完全等于lookup_value的第一个值,lookup_array参数中的值可按任何顺序排列。如果为-1,则查找大于或等于lookup_value的最小值,lookup_array参数中的值必须按降序排列。
式中,IF函数根据指定的条件来判断其“真”(TRUE)、“假”(FALSE),根据逻辑计算的真假值,从而返回相应的内容。
式中,SMALL函数返回数据集中的第k个最小值。其语法为:
SMALL(array,k)
Array:必需,需要找到第k个最小值的数组或数值数据区域;如果array为空,则SMALL返回错误值#NUM!。
k:必需,要返回的数据在数组或数据区域里的位置(从小到大);如果k≤0或k超过了数据点个数,则SMALL返回错误值#NUM!。
式中,INDEX函数返回表或区域中的值或对值的引用,有数组和引用两种形式,数组形式通常返回数值或数值数组,引用形式通常返回引用。其数组形式的语法为:
INDEX(array, row_num, [column_num])
array(区域):必需,单元格区域或数组常量;如果数组只包含一行或一列,则相对应的参数row_num或column_num为可选参数;如果数组有多行和多列,但只使用row_num或column_num,则返回数组中的整行或整列,且返回值也为数组。
row_num(行数):必需,选择数组中的某行,函数从该行返回数值;如果省略,则必须有第3参数。
column_num(列数):可选,为选择数组中的某列,函数从该列返回数值;如果省略第3参数,则必须有。如果同时使用参数和第3参数,函数INDEX返回和第3参数交叉处的单元格中的值。如果第3参数设置为0(零),函数INDEX则分别返回整个列或行的数组数值。
本式中,外层IF函数统揽全局。先分析条件部分“ROW(1:1)>SUM(1/COUNTIF(date,date))”。COUNTIF函数计算名称date区域包含date的个数为一个数组“{8;8;8;8;8;8;8;8;3;3;3;3;3;3;5;5;5;5;5;5;5;5;5;5;6;6;6;6;6;6}”,该数组被“1”除,结果仍为一个数组“{0.125;0.125;0.125;0.125;0.125;0.125;0.125;0.125;0.333333333333333;0.333333333333333;0.333333333333333;0.33333 3333333333;0.333333333333333;0.333333333333333;0.2;0.2;0.2;0.2;0.2;0.2;0.2;0.2;0.2;0.2;0.1 66666666666667;0.166666666666667;0.166666666666667;0.166666666666667;0.1666666666 66667;0.166666666666667}”,作为SUM函数的参数。SUM函数求和得到“6”,这实际是不重复的日期个数。整个公式的意思是:如果个数超过“6”,则返回空白单元格,否则,返回第3参数的计算结果。再分析第3参数“INDEX(date,SMALL(IF(MATCH(date,date,)=ROW(date)-2,ROW(date)-2),ROW(1:1)))”。MATCH函数返回date在date中第一次出现的位置,为一个数组“{1;1;1;1;1;1;1;1;9;9;9;12;12;12;15;15;15;15;19;19;19;19;19;15;25;25;25;25;25;25}”。该数组与date的行号减去2的结果数组“{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30}”相比较,比较结果再作为IF函数的条件部分。IF函数就确定出不重复日期第一次的位置,为一个数组“{1;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;9;FALSE;FALSE;12;FALSE;FALSE;15;FALSE;FALSE;FALSE;19;FALSE;FALSE;FALSE;FALSE;FALSE;25;FALSE;FALSE;FALSE;FALSE;FALSE}”,该数组作为SMALL函数的。SMALL函数则依次返回该数组的第1,2,…,n个最小值;当为第1个最小值时,结果为“{1}”,该结果作为INDEX函数的。INDEX函数就返回date区域的第“{1}”个位置,结果为“42772”,转换为日期格式就是“2017/2/6”。
解题思路2:对数据透视表而言,条件求和是小菜一碟,可以使用数据透视表根据条件快速求和。
解题过程:插入数据透视表,复制并修改数据透视表。
(1)插入数据透视表。操作过程为:
➊ 单击“插入”选项卡。
➋ 单击“表格”组中的“数据透视表”按钮。
➌ 在弹出的“创建数据透视表”对话框中,将鼠标放置于“选择一个表或区域”单选按钮右侧的“表/区域”框中,使用鼠标拖动选择A2:D32区域。
➍ 在“选择放置数据透视表的位置”组中单击“现有工作表”单选按钮。
➎ 将鼠标放置于“位置”框中,单击J1单元格。
➏ 单击“确定”按钮,随即生成空白数据透视表并弹出“数据透视表字段”任务窗格。
➐ 在“数据透视表字段”任务窗格,将字段节区域中的“保费”字段拖放到“值”区域节,将“销售员”字段分别拖放到“行”区域节和“值”区域节。
操作过程及结果如图2-69所示。
图2-69 插入数据透视表按销售员统计保费
(2)复制并修改数据透视表。操作过程为:
➊ 全选第一个透视表,复制、粘贴到J10单元格。
➋ 在“数据透视表字段”任务窗格,将区域节中原有“销售员”字段拖出,将字段节区域中的“日期”字段拖放到“行”区域节,将“车型”字段拖放到“值”区域节。
操作过程及结果如图2-70所示。
图2-70 复制并修改数据透视表为按日期统计保费
2.3.2 多条件求和
顾名思义,按多个条件求和,则为多条件求和。
例2-15 在例2-13的基础上,如何同时按销售员和车型统计保费?
解题思路1:题目要求按销售员和车型2个条件统计保费,可使用函数公式求和。
解题过程:建立统计表,输入函数公式。
(1)建立统计表。为帮助读者理解多条件求和函数,本例介绍使用多个函数进行多条件求和。建立多个统计表,如图2-71所示。
图2-71 建立8个统计表
(2)输入函数公式。
在O3单元格输入函数公式“=SUMIFS($D$3:$D$32,$B$3:$B$32,$N3,$C$3:$C$32,O$2)”。
在R3单元格输入函数公式“=SUM(O3:Q3)”。
在O7单元格输入函数公式“=SUM(O3:O6)”。
将O3单元格的公式向右填充至Q3单元格,将O3:R3区域的公式向下填充至R6单元格,将O7单元格的公式向右填充至R7单元格。
复制O3:R7区域的公式到其他6个格局一样的区域,然后只需要修改条件求和公式。
在U3:W6区域输入数组公式“{=SUMIFS(D3:D32,B3:B32,T3:T6,C3:C32,U2:W2)}”。
第1个和第2个统计表的结果如图2-72所示。
图2-72 第1个和第2个统计表的结果
在O11单元格输入数组公式“{=SUM(($B$3:$B$32=$N11)*($C$3:$C$32=O$10)*($D$3:$D$32))}”。
将O11单元格的公式向右下填充至Q14单元格。
在U11单元格输入数组公式“{=SUM(IF(($B$3:$B$32=$T11)*($C$3:$C$32=U$10),1,0)*$D$3:$D$32)}”。
将U11单元格的公式向右下填充至W14单元格。
第3个和第4个统计表的结果如图2-73所示。
图2-73 第3个和第4个统计表的结果
在O19单元格输入数组公式“{=MMULT(--(TRANSPOSE($B$3:$B$32)=$N19),($C$3:$C$32=O$18)*$D$3:$D$32)}”。
将O19单元格的公式向右下填充至Q22单元格。
在V19:W22区域输入数组公式“{=MMULT(--(TRANSPOSE(B3:B32)=T19:T22),(C3:C32=U18:W18)*D3:D32)}”。
第5个和第6个统计表的结果如图2-74所示。
图2-74 第5个和第6个统计表的结果
在O27单元格输入函数公式“{=SUMPRODUCT(($B$3:$B$32=$N27)*1,($C$3:$C$32=O$26)*1,$D$3:$D$32)}”。
将O27单元格的公式向右下填充至Q30单元格。
第7个统计表的结果如图2-75所示。
图2-75 第7个统计表的结果
在Q36单元格输入函数公式“=DCOUNTA(A2:D32,B2,N35:O36)”。
在R36单元格输入函数公式“=DSUM(A2:D32,D2,N35:O36)”。
第8个统计表的结果如图2-76所示。
图2-76 数据库函数多条件计数与求和的结果
【函数公式解析】
先介绍SUMIFS函数的用法。SUMIFS函数是一个数学与三角函数,用于计算其满足多个条件的全部参数的总量。它是Excel 2007及其以后版本的新增函数,是对SUMIF函数的扩展。其语法为:
SUMIFS(sum_range, criteria_range1, criteria1, [criteria_range2, criteria2],…)”
sum_range:必需,要求和的单元格区域。
criteria_range1:必需,使用criteria1测试的区域。
criteria1:必需,定义将计算第1个测试区域中的哪些单元格的和的条件。
第2参数和第3参数构成搜索某个区域是否符合特定条件的搜索对,最多可以输入127个区域/条件对。SUMIFS函数的语法可以这么翻译:
SUMIFS(求和区域,条件区域1,条件1,[条件区域2,条件2],…)
显然,O3单元格的公式“=SUMIFS($D$3:$D$32,$B$3:$B$32,$N3,$C$3:$C$32,O$2)”是一个普通的函数公式。当然,可以将公式改成多单元格数组公式,就是U3:W6区域的公式“{=SUMIFS(D3:D32,B3:B32,T3:T6,C3:C32,U2:W2)}”。输入该数组公式前,要选择U3:W6区域,完成公式后按“Ctrl+Alt+Enter”组合键结束。
再介绍MMULT函数的用法。MMULT函数最显著的特征是,Array1的列数必须与Array2的行数相同,而且两个数组中都只能包含数值。在O19单元格的数组公式“{=MMULT(--(TRANSPOSE($B$3:$B$32)=$N19),($C$3:$C$32=O$18)*$D$3:$D$32)}”,其基本结构是“MMULT(条件1,(条件2)*(求和数据区))”。式中,TRANSPOSE函数先将B3:B32区域这个纵向区域转置成横向区域,再与N19单元格的值进行比较,结果为一个逻辑值数组;使用双减号“--”将这个逻辑值数组转换为常量数组“{1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,0,0,0}”,这个常量数组就是MMULT函数的第1个参数。C3:C32区域的值与O18单元格的值进行比较,结果也为一个逻辑值数组,该逻辑值数组与D3:D32的保费值相乘,得到常量数组“{4210;0;0;0;4500;4400;0;0;0;0;0;0;4600;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;4560}”,这个常量数组就是MMULT函数的第2个参数。最后,MMULT函数求和得到“4210”。当然,可以将公式改成多单元格数组公式,就是U19:W22区域的公式“=MMULT(--(TRANSPOSE(B3:B32)=T19:T22),(C3:C32=U18:W18)*D3:D32)”。B3:B32区域的值是与T19:T22区域的值进行比较,而不是与一个单元格的值进行比较。输入函数公式前,要选择U19:W22区域,完成公式后要按“Ctrl+Alt+Enter”组合键结束。
最后介绍数据库函数。Excel共有12个工作表函数,用于对存储在数据清单或数据库中的数据进行分析,这些函数的统一名称为DFUNCTIONS,也称为D函数,每个函数均有3个相同的参数:database、field和criteria。这些参数指向数据库函数所使用的工作表区域。其中,参数database为工作表上包含数据清单的区域;参数field为需要汇总的列的标志;参数criteria为工作表上包含指定条件的区域。
解题思路2:根据多条件求和,对数据透视表而言,是不费吹灰之力的事情,可以使用数据透视表快速求和。
解题过程:具体操作过程为:
➊ 单击“插入”选项卡。
➋ 单击“表格”组中的“数据透视表”按钮。
➌ 在弹出的“创建数据透视表”对话框中,将鼠标放置于“选择一个表或区域”单选按钮右侧的“表/区域”框中,使用鼠标拖动选择A2:D32区域。
➍ 在“选择放置数据透视表的位置”组中单击“现有工作表”单选按钮。
➎ 将鼠标放置于“位置”框中,使用鼠标单击T25单元格。
➏ 单击“确定”按钮,随即生成空白数据透视表并弹出“数据透视表字段”任务窗格。
➐ 在“数据透视表字段”任务窗格,将字段节区域中“销售员”字段拖放到“行”区域节,将“车型”字段拖放到“列”区域节,将“保费”字段拖放到“值”区域节。
使用数据透视表快速求和的操作过程及结果如图2-77所示。
图2-77 插入数据透视表按销售员和车型统计保费