☰
Excel按条件去重计数全攻略:从公式到透视表一次看懂
2026/10/7 10:36:05 网站建设 项目流程

先问大家一个问题:你被“按条件去重计数”这件事折腾过多少次?

我见过好几个人对着 Excel 里的明细表,先用 COUNTIF 算出来一个数,然后发现同一客户下了好几笔单,直接把客户重复算了好几遍。也见过有人为了统计“华东区到底有几个客户下了单”,把数据拉到 Python 里跑了一遍,结果 Excel 里其实三十秒就能解决。这篇文章就围绕 Excel 公式解析里的高频需求——按条件去重计数——把原理、公式、替代方案、坑点一次讲透。

不管你是财务、运营、HR,还是经常和 Excel 打交道的表哥表姐,这套思路都能直接套用。我会按“先判断需求 → 再来选方案 → 最后避开坑”的顺序来写,既有老版本也能跑的公式,也有新版 Excel 的高效写法,还有完全不写公式的透视表方案。

1. 先想清楚:你缺的是“去重”还是“按条件过滤”?

很多人在网上搜公式,搜了半天搜到一堆COUNTIF、SUMIF、SUMPRODUCT拼拼凑凑的写法,结果放进去要么报错,要么结果明显不对。问题往往不出在公式本身,而出在需求没想清楚。

1.1 一张表区分四种常见需求

我把日常最容易混淆的四种情况列在一起,你对照一下就知道自己要的是什么:

需求典型说法对应方案
普通计数“华东区一共有多少行记录?”COUNTIF
普通求和“华东区的销售额合计是多少?”SUMIF
去重计数(无条件)“整个表里一共有多少个不重复的客户?”SUMPRODUCT(1/COUNTIF(...))或COUNTA(UNIQUE(...))
按条件去重计数“华东区有多少个不重复的客户下过单?”本文重点,下面三种方案都能做

你看,“华东区有多少个不重复的客户”这句话包含了两层动作:先是“华东区”这个条件,再是“不重复客户”这个去重动作。顺序不能反,公式写法也就不能只用一个COUNTIF或者只用一个UNIQUE。

1.2 “按条件去重”的本质:组内唯一值

用一个生活化的例子解释:班级里有 40 个学生,学校统计“参加作文比赛的人数”。小明交了 3 篇稿子,你不能把他算成 3 个人。现在换成 Excel 场景,就是一张订单明细表里,A 列是客户名,B 列是区域,你要统计“华东区”这个组里有多少个唯一客户。

本质上,这是一道“分组 + 去重”的题目。Excel 里能做这件事的路径不止一条,但各有前提条件:老版本通用公式、新版本动态数组函数、数据透视表。接下来我把三条路都走一遍。

2. SUMPRODUCT + COUNTIF:老版本也能跑通的万能公式

如果你用的还是 Excel 2016、2019,或者公司电脑上的 WPS 版本比较老,这条路是最稳妥的。它不需要新函数,也不需要数据模型,一个公式算到底。

2.1 基础公式写法与逐段拆解

假设你的表长这样:

A(客户)B(区域)
张三华东
李四华东
张三华东
王五华北
李四华北

要统计“华东区有多少个不重复客户”,公式如下:

=SUMPRODUCT((B2:B100="华东")*(1/COUNTIF(A2:A100,A2:A100)))

我刚看到这个公式的时候也愣了一下,因为(1/COUNTIF(...))这种写法实在太绕了。但拆开看其实很简单:

  • COUNTIF(A2:A100,A2:A100)可以理解成“对每一行客户名,统计它在整个 A 列里出现过多少次”。注意第二参数也是一个区域,不是单个值,这会让 COUNTIF 依次计算每个单元格的出现次数。
  • 外层再用1/次数得到每个客户名的“份额”。比如“张三”出现了 2 次,每行就只算 1/2;两个“张三”加起来就是 1,刚好等于一个唯一值。
  • (B2:B100="华东")是一组 TRUE/FALSE,在算术运算里相当于 1/0,把不在华东区的行全部归零。
  • 最后 SUMPRODUCT 把所有这些乘积加起来,得到的就是华东区唯一客户数。

用生活类比来解释就是:一个班有 40 个人,老师想知道有多少个不同的姓氏。他把所有叫“张伟”的人叫起来,让他们每个人只报“一票”,三人每人报三分之一,最后加起来刚好算 1 个“张伟”。

2.2 多条件扩展:乘号就是万能钥匙

如果从“华东”变成“华东 + 大客户”两个条件,也非常好扩展,把条件用*连接起来继续乘就行:

=SUMPRODUCT((B2:B100="华东")*(C2:C100="大客户")*(1/COUNTIF(A2:A100,A2:A100)))

这里的逻辑是:只要有一个条件不满足,对应的乘法结果就是 0;只有所有条件都满足,才会把“1/出现次数”保留下来。条件再多,也是同样的套路往下续乘。

2.3 一个重要区别:SUMPRODUCT 不需要三键,SUM 数组公式需要

你可能在网上看到过另一个很像的写法:

=SUM((B2:B100="华东")*(1/COUNTIF(A2:A100,A2:A100)))

这个公式在绝大多数老版本里不能直接回车,必须按Ctrl + Shift + Enter变成数组公式,否则结果会错。而 SUMPRODUCT 本身就是在按数组方式运算,直接回车即可,所以我个人更推荐 SUMPRODUCT,省去一个“忘记三键”的隐患。

提示:使用这类公式时,建议把范围从整列(如 A:A)改成实际数据范围(如 A2:A1000),既是为了避免空白单元格引起除零错误,也是为了防止整列计算卡顿。下面第 5 章会专门说这个坑。

3. FILTER + UNIQUE:新版本 Excel 的更清晰写法

如果你用的是 Microsoft 365 或者 Excel 2021 及以上版本,有动态数组函数可以用,那还有一条更直观的路:FILTER 负责“按条件过滤”,UNIQUE 负责“去重”,两者组合出来逻辑非常清晰。

3.1 两个函数各自解决什么问题

FILTER 的作用是从一个区域里筛出符合条件的行,比如:

=FILTER(A2:A100, B2:B100="华东")

运行后,它会直接返回一组“华东区所有客户名”的动态数组,里面有重复值。

UNIQUE 的作用是去掉重复项,比如:

=UNIQUE(A2:A100)

运行后,它会返回全部客户名去掉重复的一份清单。

两个函数一个负责“过滤条件”,一个负责“去重”,正好对应我们需求里的两个动作。

3.2 组合公式:一行搞定按条件去重计数

把两步叠加起来,外面再套一个 COUNTA 数一下非空单元格数量:

=COUNTA(UNIQUE(FILTER(A2:A100, B2:B100="华东")))

含义非常直白:先筛选出华东区客户,再去重,最后数一数还剩多少个。

多条件也一样,用乘号把条件连起来放进 FILTER:

=COUNTA(UNIQUE(FILTER(A2:A100, (B2:B100="华东")*(C2:C100="大客户"))))

这个写法最大的优点是好读、好维护。你三个月后回来看这个公式,一眼就能明白当时在算什么,不需要像 SUMPRODUCT 那样在脑子里绕一圈“1/出现次数”。

3.3 使用边界:版本、连接符和空结果

需要注意几点:

  • 普通 Excel(非 365)里,UNIQUE 和 FILTER 不一定能用,尤其是公司批量采购的旧版本 Office 2016 之类。发给别人之前要确认对方版本兼容。
  • 在 WPS 新版里也有接近的动态数组函数,但个别细节和微软官方实现不一致,跨软件使用时先在你的 WPS 里试算一下。
  • FILTER 在找不到任何满足条件的数据时,会返回#CALC!错误。如果你希望显示 0,可以套一层容错:
=IFERROR(COUNTA(UNIQUE(FILTER(A2:A100, B2:B100="华东"))), 0)

4. 数据透视表:完全不写公式也能统计非重复计数

有一类同事,一听到“数组公式”就头疼,觉得那像天书。下面这条路线对这类人非常友好,而且在大数据量场景下性能比公式更好。

4.1 操作步骤:勾一个选项就行

数据透视表默认确实没有“去重计数”这个功能,但 Excel 2013 之后隐藏了一个入口。做法如下:

  1. 选中明细数据,点击“插入” → “数据透视表”。
  2. 在弹出的对话框里,找到“将此数据添加到数据模型”的勾选框,勾选它。
  3. 把“区域”拖到行字段,把“客户”拖到值字段。
  4. 此时值字段默认是“计数”,点击值字段的下拉菜单,选择“值字段设置”。
  5. 在“计算类型”里选择“非重复计数”。

就这么简单。要注意的是,如果一开始没有勾选“添加到数据模型”,第 5 步里是看不到“非重复计数”这个选项的,很多人都是卡在这一步。

勾选数据模型后,Excel 会在内部压缩数据,透视表对“客户”字段计算不重复值,效果和公式完全一致,而且数据量大时非常流畅。

4.2 什么时候优先选择透视表

我个人的经验是:如果数据量超过十几万行,SUMPRODUCT 那种公式会让你等得想砸电脑。这时候透视表 + 数据模型是唯一推荐方案。另外,如果你只是临时看一个数,不打算把公式长期留在表里,透视表也合适——操作几秒钟就能出结果,还顺便能得到各区域的分类汇总。

4.3 透视表方案的限制

  • 一旦原始明细数据变化(新增或删除行),透视表需要右键“刷新”才能更新结果,不会像公式那样自动重算。
  • 使用数据模型的透视表,和传统透视表在部分高级操作上略有差异,比如有些版本的布局选项不能完全通用。
  • 如果你是做报表模板然后发给别人,对方不一定知道怎么刷新,这时候公式反而更合适。

5. 实战里最容易翻车的几个高发坑

写了不少年 Excel 公式,我发现按条件去重计数的高发坑非常集中。每个坑我都踩过,现在挨个说透。

5.1 坑 1:空白单元格让经典公式直接报 #DIV/0!

SUMPRODUCT + COUNTIF 这个公式里有一层1/COUNTIF(...),如果数据范围里存在完全空白单元格,COUNTIF 返回的是 0,1/0 就会让你整个人都不好。

这个问题的根源是:COUNTIF(A2:A100, A2:A100)会拿范围内的每个值去做条件统计。当它统计到一个空白单元格时,Countif 对这个空白的统计结果其实是 0,除零错误就来了。

规避方法有几种:

  • 把范围精确写成实际有数据的区域,比如A2:A100,而不要写整列。
  • 如果空白单元格无法避免,可以用数组公式的 IF 包裹写法:
=SUM((B2:B100="华东")*IF(A2:A100<>"",1/COUNTIF(A2:A100,A2:A100),0))

输入后按Ctrl + Shift + Enter确认。这个写法用 IF 把空白单元格对应的计算变成 0,除零错误就不会出现了。

5.2 坑 2:文本数字和真数字混存,去重结果莫名偏大

Excel 里1和文本形式的"1"看起来一样,但 COUNTIF 会分别计数。比如客户编号里有 Excel 数值型和从其他系统导出的文本型,同一个编号“1001”如果因为存储格式不同,会被当成两个不同的唯一值统计。

我在实际项目里就遇到过:系统导出的客户 ID 有前导零,比如001和1,视觉上都是 1,但一个是文本一个是数值,COUNTIF 去重后结果比真实客户数多出一截。

排查方法很简单:用=TYPE(A2)看看返回的到底是 1(数值)还是 2(文本),或者直接把列转换为统一格式。如果只是编号列,建议用分列功能把整列转成统一类型,去重结果立刻正常。

5.3 坑 3:通配符污染 COUNTIF 计数

COUNTIF 的老用户应该知道,星号*、问号?、波浪号~在 COUNTIF 的条件里是有特殊含义的,星号代表任意字符,问号代表任意单字符,波浪号是转义符。

这意味着什么?如果你处理的数据里,某一个单元格的内容本身就是*,那么COUNTIF(A2:A100, A2:A100)在处理这个单元格时会把它当作“所有内容的通配条件”,返回整个范围的记录数,结果一下崩掉。

遇到含特殊字符的数据,比如产品名里有“A*B”,用这类去重公式就要当心。一个稳妥做法是避开 COUNTIF 思路,改用透视表或者 FILTER + UNIQUE;如果必须用公式,可以考虑用 EXACT 实现完全匹配的数组公式,但它又是另一个复杂战场了。

5.4 坑 4:筛选状态下公式不会跟随变化

有人在 Excel 里对明细表做了筛选,只勾选“华东”区域,然后指着 SUMPRODUCT 公式说:这个数怎么没用?

COUNTIF 和 SUMPRODUCT 这类普通公式统计的是整个数据范围,不会因为你筛选掉某几行就改变统计范围,除非你用 SUBTOTAL 或者整体数据用 FILTER 重算。如果你希望结果跟随筛选变化,建议切换思路:直接对筛选后的结果使用透视表,或者把公式建立在 FILTER 动态数组的返回值上。

5.5 坑 5:整列引用导致表格卡成“PPT”

为了让公式“绝对覆盖所有数据”,很多人会写=SUMPRODUCT((B:B="华东")*(1/COUNTIF(A:A,A:A)))。这个写法在小表里看着没事,但只要你以后往表里塞了几万行数据,公式会拖慢整个文件的速度,因为 COUNTIF 在整列上的计算量是几何级数增长的。

我的习惯是:给明细数据定义一个表格区域(快捷键Ctrl + T),或者把范围限制到一个足够大但不会太大的区间,比如A2:A10000。这样公式只计算真实数据范围,性能和正确性都有保障。

还有一个小建议:不要把这种去重公式放在同一列里向下复制几百行的超级表区域,除非你明确知道你在做什么。它跟普通 SUM 不一样,向下拖动会出现一堆重复计算和错误。

结尾:方案怎么选?

最后分享一点我自己的使用习惯。如果你要跟别人协作、数据量不大、又要长期自动跟随变化,我首选老版本的经典 SUMPRODUCT 公式——兼容性好,对文件大小影响小,同事用 WPS 打开也不出问题。难点是它不够直观,容易把人绕晕。

如果你自己用、版本又足够新,强烈推荐 FILTER + UNIQUE 路线——逻辑清楚、好读好看好维护,多条件时也基本不会写错。

至于几万行以上的明细,或者频繁需要分组看汇总的场景,直接上数据透视表,勾选数据模型加非重复计数,又快又稳,不给自己添堵。

这三个方案各有各的适合场景,没有绝对的“最好的公式”,只有“当前情境下最合适的工具”。按条件去重计数这个需求,难的不是公式本身,而是把需求想明白,然后选对工具——想明白这一步之后,剩下的事都很快。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询