平均值陷阱:AVERAGE、AVERAGEIF 和中位数
一、AVERAGE 的分母不是行数

=AVERAGE(数字1,[数字2],...) 的计算过程是总和除以数值个数,而不是总和除以行数。这个区别看起来微不足道,实际上是最常见的平均值错误来源。C2 到 C200 共 199 个格子,其中 180 个有金额、15 个写着待定、4 个是空的,那么 =AVERAGE(C2:C200) 得到的是这 180 个数的平均,分母是 180 不是 199。
这个特性在多数情况下是好事:你不需要为了几个空单元格专门清理数据。但当下表中的零和空白表达不同含义时,问题就来了。比如考核表里有些人没打分,单元格是空的,AVERAGE 会把他们直接排除;另一些人打了 0 分,AVERAGE 会把 0 计入并拉低均值。空与 0 的含义完全不同,但函数看不出来,只有你知道该不该算进去。
AVERAGE 与 SUM 一样会忽略文本和逻辑值,也和 SUM 一样不忽略错误值。区域里只要有一个 #DIV/0!,整个平均值就报错。同样,文本型数字会被跳过,导致分子分母同时偏小,结果看似合理实则失真。
如果你确实需要把空白当成 0 参与平均,不能直接用 AVERAGE。替代写法是 =SUM(C2:C200)/ROWS(C2:C200),分母由区域行数决定,这样空白就等于 0 了。反过来,如果要把 0 排除在平均之外,则要用 AVERAGEIF,写成 =AVERAGEIF(C2:C200,"<>0")。先想清楚 0 与空白在业务上分别代表什么,再决定用哪种写法。
还有一种常见误用:对已经算好的平均值再做平均。比如每个部门各有一个平均分,再把十个部门的平均分平均一下,得到的值只有在各部门人数完全相同时才等于全员平均分。正确做法是回到原始数据,用总金额除以总人数,或者做加权平均。这一点在后面的小节里会细说。
还有一种更隐蔽的情况:区域里混着 NA 这样的占位文本。AVERAGE 会跳过它们,但如果这些行本该是 0,平均值就会被高估。判断方法是对比 =COUNT(C2:C200) 与实际数据行数,两者不一致就要停下来查。花两分钟做这个检查,能避免一次汇报事故。
再补充一个实战细节:AVERAGE 会自动忽略区域里的文本,这一特性常被用来做条件平均的简化写法。比如把不需要参与计算的行在辅助列里标记成短横线或空白,AVERAGE 就会自动绕过它们,比写一堆 IF 判断省事得多。当然前提是这些文本标记不会被人误当成数据读走。
顺带说一句,AVERAGE 对逻辑值的处理与 SUM 不同。直接写在参数里的 TRUE 与 FALSE 会被当成 1 和 0 参与计算,而区域里的逻辑值则被忽略。这种不一致很少遇到,但一旦遇到会让人怀疑人生,知道原因就够了。
二、AVERAGEIF 与 AVERAGEIFS
=AVERAGEIF(条件区域,条件,[平均区域]) 的参数顺序与 SUMIF 完全一致,第三个参数可以省略,省略时对条件区域本身求平均。例如算市场部的平均销售额,写 =AVERAGEIF(B2:B200,"市场部",C2:C200);算所有大于 5000 的订单的平均金额,写 =AVERAGEIF(C2:C200,">5000")。
=AVERAGEIFS(平均区域,条件区域1,条件1,[条件区域2,条件2],...) 是多条件版本,平均区域在最前面,与 SUMIFS 一致。例如算市场部在 2026 年一月的平均销售额,写成 =AVERAGEIFS(C2:C200,B2:B200,"市场部",A2:A200,">="&DATE(2026,1,1),A2:A200,"<"&DATE(2026,2,1))。
| 函数 | 平均区域位置 | 条件个数 | 空单元格 | 零值 | 典型写法 |
|---|---|---|---|---|---|
| AVERAGE | 首参数即对象 | 0 个 | 跳过 | 计入 | =AVERAGE(C2:C200) |
| AVERAGEIF | 最后一个参数 | 1 个 | 跳过 | 计入 | =AVERAGEIF(B2:B200,"市场部",C2:C200) |
| AVERAGEIFS | 第一个参数 | 1 到 127 个 | 跳过 | 计入 | =AVERAGEIFS(C2:C200,B2:B200,"市场部",C2:C200,">0") |
| SUM 除以 COUNT | 由内层决定 | 任意 | 视为 0 | 计入 | =SUM(C2:C200)/COUNT(C2:C200) |
需要特别警惕的是:当所有符合条件的单元格数量为 0 时,AVERAGEIF 与 AVERAGEIFS 会返回 #DIV/0!,因为分母为 0。做模板时建议外层套 IFERROR,写成 =IFERROR(AVERAGEIF(B2:B200,F1,C2:C200),0) 或者返回一段提示文字。关于兜底写法的更多细节,见 XLOOKUP 与 IFERROR:新写法和兜底。
三、中位数:什么时候该用 MEDIAN

=MEDIAN(数字1,[数字2],...) 返回一组数据的中位数,也就是把数据从小到大排好序后位于正中间的那个数;数据个数为偶数时,取中间两个数的平均值。它会忽略文本、逻辑值和空单元格,规则与 AVERAGE 相同。
中位数最大的价值是抗极端值。假设某团队十个人的月薪分别是八千上下,但老板的月薪是五十万,用 AVERAGE 算出来的平均月薪会被拉到六万,完全不能反映普通员工的收入水平;用 MEDIAN 算出来仍然是八千左右,才是这张表该给出的答案。
判断该用哪个,有一条简单规则:如果数据分布大致对称、没有离谱的极端值,用 AVERAGE;如果存在少数极大或极小值、分布明显偏斜,用 MEDIAN。收入、房价、客单价、响应时长这类指标,几乎都属于后者。
最稳妥的呈现方式是两个都给。在报表里同时列出平均值与中位数,并附上两者差值,读者一眼就能看出数据是不是被极端值带偏了。如果平均值明显高于中位数,说明存在少数高值拉高均值,这时中位数更能代表典型水平。
中位数的另一个优势是它对录入错误不敏感。假设某个金额多敲了一个 0,从 5000 变成 50000,平均值会被明显拉高,而中位数几乎纹丝不动。所以在做数据质量自检时,可以对比平均值与中位数的偏离程度,偏离过大往往提示存在异常值,值得回头查一遍原始数据。
需要注意的是,MEDIAN 只有一个参数列表,没有 MEDIANIF 这样的条件版本。要算某个部门的中位数,需要先筛选,或者用数组写法。Excel 365 里可以写成 =MEDIAN(FILTER(C2:C200,B2:B200="市场部")),FILTER 先过滤再取中位数,逻辑清晰。老版本里只能加辅助列,把不符合条件的值替换成空值后再取中位数。
四、加权平均与几种变体
加权平均没有专门函数,通用写法是 =SUMPRODUCT(数值区域,权重区域)/SUM(权重区域)。例如三笔贷款的金额分别是 100 万、300 万、600 万,利率分别是 4.5、5.2、5.8,则加权平均利率为 =SUMPRODUCT(A2:A4,B2:B4)/SUM(A2:A4),结果约为 5.53,而不是三个利率的简单平均 5.17。
另一个变体是去极值平均,也就是常说的去掉一个最高分去掉一个最低分。Excel 提供了专门的 TRIMMEAN 函数,写成 =TRIMMEAN(C2:C20,0.2) 表示去掉前后各 10% 的数据后取平均。第二参数是比例,0.2 意味着总共剔除 20%,高端低端各一半。这个函数在评分汇总场景里非常好用。
还有按可见单元格求平均的需求,AVERAGE 做不到,要用 SUBTOTAL 并把第一参数写成 101。筛选之后状态栏的平均值会自动切换,但公式不会,所以做筛选看板时记得用 SUBTOTAL 而不是 AVERAGE。
SUMPRODUCT 做加权平均时,两个区域的形状必须完全一致,都是同样多的行、同样多的列,否则会返回错误。另外权重区域里不能有空白,空白会被当成 0,导致那一项不参与加权,结果是分子分母同时缩小,虽然不至于报错,但含义已经变了。写完后用 =SUM(权重区域) 核一下分母,是个便宜又有效的检查动作。
如果要按分类分别算加权平均,不必为每个分类写一条公式。把分类放在汇总表的第一列,然后用 =SUMPRODUCT((B2:B200=F2)*C2:C200*D2:D200)/SUMIF(B2:B200,F2,D2:D200) 这种写法,向下填充即可。分子里用比较运算生成 0 和 1 的掩码,只让符合条件的行参与加权,分母用 SUMIF 汇总对应的权重。公式看起来长,但结构很规整,替换区域就能复用。
五、真实场景与呈现建议
先说一个通用的呈现原则:任何平均值旁边都应该有样本量。平均值 4.2 分,如果是 1000 份问卷的结果,可信度很高;如果只有 3 份,那基本没有参考价值。在报表里把 =COUNT(C2:C200) 的结果放在平均值下方或右侧,是一句话成本、长期收益的习惯。
场景一:销售人均产出。正确做法是 =SUM(C2:C200)/COUNTA(B2:B200),用总业绩除以总人数,而不是 =AVERAGE(C2:C200)。后者算出的是人均订单金额,也就是按订单数平均,如果一个人有五笔订单,他会被算五次。这两个指标的差别巨大,报表里必须写清楚是哪一种。
场景二:客户满意度。问卷打分 1 到 5 分,平均 4.2 分看起来不错,但如果有三成客户打了 1 分、七成打了 5 分,平均值同样是 4.2 而实际口碑两极分化。此时应该同时给出中位数和 1 分占比。平均值会掩盖分布形态,这是它最大的局限。
场景三:库存周转天数。多行明细里每一行是一个 SKU,直接对周转天数求平均,会让销量极小的长尾 SKU 与主力 SKU 权重相同。正确做法是按销量或库存金额加权,也就是 =SUMPRODUCT(天数区域,金额区域)/SUM(金额区域)。
场景三补充一点:加权平均的权重选什么,本身就是业务判断。库存周转天数按库存金额加权,反映的是资金占用效率;按销量加权,反映的是实际流转速度。两者都合理,结论可能相反。写公式前先和业务方确认权重口径,并在表格里注明,否则很容易在复盘时各执一词。
场景四:月度趋势。把每月平均值做成折线图时,如果某个月只有两三条数据,那个月的平均值波动会非常大,看起来像业务剧烈震荡,实际上只是样本太少。建议在图表旁边加一列样本量,或者对样本量少于某个阈值的结果做淡化处理。
六、不同口径的结果差多少
同一份数据,用不同口径算出来的平均值可能天差地别。下面这张表用一份真实的销售数据做对照:共 199 行,其中 180 行有金额,15 行写着待定,4 行为空,另有 3 行金额为 0。
| 口径 | 写法 | 分母 | 适用场景 |
|---|---|---|---|
| 忽略空白与文本 | =AVERAGE(C2:C200) |
180 | 常规统计,最常用 |
| 空白按 0 计入 | =SUM(C2:C200)/ROWS(C2:C200) |
199 | 未填即视为 0 的考核 |
| 排除 0 值 | =AVERAGEIF(C2:C200,"<>0") |
177 | 0 表示不适用 |
| 单条件平均 | =AVERAGEIF(B2:B200,"市场部",C2:C200) |
该部门行数 | 分部门对比 |
| 多条件平均 | =AVERAGEIFS(C2:C200,B2:B200,"市场部",C2:C200,">0") |
同时满足的行数 | 剔除无效记录 |
| 去极值平均 | =TRIMMEAN(C2:C200,0.1) |
约 162 | 评分、比赛 |
把这六种结果并排列在报表里,你会发现差异可能超过百分之三十。所以在给出任何一个平均值之前,先确认口径,并把口径写进表格的标题或批注里。一份没有标注口径的平均值,和没有单位的数字一样,是没有意义的。
还有一个容易被忽略的点:平均值的小数位数。=AVERAGE(C2:C200) 可能返回 3856.42857142857 这样的长小数,直接呈现既不专业也不好读。用 =ROUND(AVERAGE(C2:C200),1) 保留一位小数即可。取整函数的完整说明见 取整与余数:ROUND、INT、MOD 和取余套路。
常见问题
为什么 AVERAGE 的结果和手工算的不一样
最可能的原因是分母不同。手工算时你多半用了总行数,而 AVERAGE 用的是数值个数。用 =COUNT(C2:C200) 看看数值个数是多少,再用 =SUM(C2:C200)/COUNT(C2:C200) 验一遍,两者应该完全一致。如果不一致,说明有文本型数字或者错误值混在里面。
平均值公式要不要写死区域
建议不要写死。数据会增长,写死 C2:C200 意味着第 201 行之后的数据永远进不了统计。三种改进方式:把区域扩到 C2:C5000 留足余量;把数据转成智能表后用结构化引用;或者直接用整列 C:C 并在旁边明确标注不含小计行。第一种最省事,第二种最规范,第三种要格外小心表头和小计。
怎么把 0 排除在平均值之外
用 =AVERAGEIF(C2:C200,"<>0"),条件不等于 0 即可。注意只要写成不等于 0,空白单元格本来就被忽略,不受影响。如果你的目标是排除空白但保留 0,那就用 AVERAGE,它本来就会跳过空白。两者的区别再强调一次:AVERAGE 跳过空白、保留 0;AVERAGEIF 加不等于 0 的条件则跳过 0。
平均分再平均为什么会错
因为权重被抹掉了。十个部门的平均分直接平均,等于假设每个部门人数相同。正确做法是回到明细,用总额除以总人数,或者用 SUMPRODUCT 按人数加权。举个极端的例子:A 部门 1 人得 100 分,B 部门 99 人得 50 分,两个部门平均分再平均得到 75 分,而全员真实平均分只有 50.5 分,差距之大足以让决策完全跑偏。
中位数在 WPS 里叫什么
同样叫 MEDIAN,参数一致,行为一致。TRIMMEAN 在 WPS 里也支持。真正需要注意的是 AVERAGEIFS:部分非常老的 WPS 版本没有这个函数,遇到返回 #NAME? 时,改用 =SUMIFS(C:C,B:B,"市场部")/COUNTIFS(B:B,"市场部") 这种除法组合替代,兼容性最好,逻辑也完全等价。
平均值要不要先剔除异常值
看目的。如果是为了描述典型水平,剔除更合适;如果是为了核算总额,绝不能剔除,因为总额必须真实。折中做法是两个都算:保留一个全量平均值用于核算,再给一个去极值平均值用于描述。用 TRIMMEAN 可以一行搞定后者,不用手工删数据,也保留了可追溯性。
平均值能不能直接用于考核排名
谨慎。平均值对样本量不设防,一个人的极端表现可以轻易改变排名。比较稳妥的做法是给平均值设一个最低样本量门槛,例如少于 5 条记录不参与排名,并用 IF 判断自动标注。条件判断的写法见 IF 家族:IF、IFS 与多层嵌套,把 =IF(COUNT(...)<5,"样本不足",AVERAGE(...)) 套进去即可。
中位数和平均值差很多,说明什么
说明数据分布不对称。若平均值远大于中位数,说明有少数极大值把均值拉高,典型场景是收入、销售额、客单价;若平均值远小于中位数,说明有少数极小值,常见于带负值或退货的指标。两种情况都提示你不该只报平均值。把两者并列呈现,再加一个最大值与最小值,读者就能自己判断数据的真实形态。
AVERAGEIF 的条件区域能跨工作表吗
可以。写成 =AVERAGEIF(明细!B2:B200,"市场部",明细!C2:C200) 即可,规则与同表引用完全一致。跨表时建议用鼠标点选让 Excel 自动补全工作表名,避免手打出错。如果工作表名包含空格或中文以外的特殊字符,Excel 会自动加上单引号,不要手动删掉那对单引号,否则公式会解析失败。
区域里有错误值,平均值直接报错怎么办
先用 =COUNT(C2:C200) 与 =COUNTA(C2:C200) 定位,再用定位条件里的公式错误项批量选中出错单元格,逐个修正。急于出结果时,可以临时写成 =IFERROR(AVERAGE(C2:C200),"待补录"),但要记得这只是临时方案,长期看还是应该修好数据源。判断数据里究竟有多少个数值、多少个文本,可以回到 计数三兄弟:COUNT、COUNTA、COUNTIF、COUNTIFS 里讲的对比方法。
