ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Excel按条件去重计数全攻略:从公式到透视表一次看懂

Excel按条件去重计数全攻略:从公式到透视表一次看懂 先问大家一个问题你被“按条件去重计数”这件事折腾过多少次我见过好几个人对着 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华东)))含义非常直白先筛选出华东区客户再去重最后数一数还剩多少个。多条件也一样用乘号把条件连起来放进 FILTERCOUNTA(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 之后隐藏了一个入口。做法如下选中明细数据点击“插入” → “数据透视表”。在弹出的对话框里找到“将此数据添加到数据模型”的勾选框勾选它。把“区域”拖到行字段把“客户”拖到值字段。此时值字段默认是“计数”点击值字段的下拉菜单选择“值字段设置”。在“计算类型”里选择“非重复计数”。就这么简单。要注意的是如果一开始没有勾选“添加到数据模型”第 5 步里是看不到“非重复计数”这个选项的很多人都是卡在这一步。勾选数据模型后Excel 会在内部压缩数据透视表对“客户”字段计算不重复值效果和公式完全一致而且数据量大时非常流畅。4.2 什么时候优先选择透视表我个人的经验是如果数据量超过十几万行SUMPRODUCT 那种公式会让你等得想砸电脑。这时候透视表 数据模型是唯一推荐方案。另外如果你只是临时看一个数不打算把公式长期留在表里透视表也合适——操作几秒钟就能出结果还顺便能得到各区域的分类汇总。4.3 透视表方案的限制一旦原始明细数据变化新增或删除行透视表需要右键“刷新”才能更新结果不会像公式那样自动重算。使用数据模型的透视表和传统透视表在部分高级操作上略有差异比如有些版本的布局选项不能完全通用。如果你是做报表模板然后发给别人对方不一定知道怎么刷新这时候公式反而更合适。5. 实战里最容易翻车的几个高发坑写了不少年 Excel 公式我发现按条件去重计数的高发坑非常集中。每个坑我都踩过现在挨个说透。5.1 坑 1空白单元格让经典公式直接报 #DIV/0!SUMPRODUCT COUNTIF 这个公式里有一层1/COUNTIF(...)如果数据范围里存在完全空白单元格COUNTIF 返回的是 01/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 路线——逻辑清楚、好读好看好维护多条件时也基本不会写错。至于几万行以上的明细或者频繁需要分组看汇总的场景直接上数据透视表勾选数据模型加非重复计数又快又稳不给自己添堵。这三个方案各有各的适合场景没有绝对的“最好的公式”只有“当前情境下最合适的工具”。按条件去重计数这个需求难的不是公式本身而是把需求想明白然后选对工具——想明白这一步之后剩下的事都很快。
返回列表