ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Excel按条件去重计数:三套公式与实战案例

Excel按条件去重计数:三套公式与实战案例 做数据统计的人迟早都会撞上“按条件去重计数”这个需求。查订单有多少个客户、算某一个地区一共成交了几家门店、统计某段时间内出现过多少个产品型号这些事情听起来跟 Excel 函数公式大全里那些花活差不多真上手却容易翻车用 COUNTIF 能数出所有出现次数一加条件就不知道怎么写用 SUMIFS 能求和却不能去重有人把辅助列拉了一长串最后喊公式下拉失效、结果对不上。这篇内容就是把“按条件去重计数”这件事彻底拆开从普通计数讲到多条件去重计数从低版本 Excel 到 365 新函数配合可复制的公式和实战案例给到能直接抄作业的写法。适合每天跟订单表、客户表、库存表打交道的业务人员也适合刚接手报表、被“重复记录”折磨的数据处理新手。1. 先搞懂“去重计数”和“条件去重计数”很多朋友一上来就搜“excel多条件筛选”“excel函数公式大全”想找一个现成函数结果发现单个函数没有直接支持的。真正的原因在于Excel 的常规函数都是“面向行”操作的要么统计行数要么按条件筛选行要么对行做计算。而“去重计数”是先看整列或者某个范围内有哪些不重复的项目再对不重复项目计数这个逻辑本身就需要“数组计算”或专用新函数来支持。不先把概念掰开后面所有公式都只会背不会改。1.1 普通去重计数先把地基打牢普通去重计数典型例子是“客户名单里一共有多少个不同的客户”。假设A列是客户名称从A2到A100有数据想去重计数最经典的低版本写法是SUMPRODUCT(1/COUNTIF(A2:A100,A2:A100))这句话读起来稍微绕但原理非常直观。COUNTIF(A2:A100, A2:A100) 是对范围内每一个单元格分别统计它出现的次数。比如“张三”出现了3次这个函数就会在一整段数组中给“张三”对应的位置都返回3。再用1去除以这个次数每一个重复项就被拆成了1/3 1/3 1/3加起来正好等于1。SUMPRODUCT 再把所有“1”相加得到的就是不重复项的总数。这个公式是低版本环境里的万金油能运行但对新人不太友好看不懂就很难改。后来 Office 365 和 WPS 新版里有了 UNIQUE 函数直接可以写COUNTA(UNIQUE(A2:A100))UNIQUE 负责把不重复的项目提取成一个数组COUNTA 再数一下有多少个含义清清楚楚。如果你的 Excel 版本支持我建议优先用这个写法可读性高后续扩展条件也方便。不会算的人先把普通去重计数弄明白条件去重只是在这基础上加一道“闸门”。1.2 按条件去重计数为什么不能直接用 COUNTIF 或 SUMIFS按条件去重计数的典型需求是“上海地区一共成交了哪几个客户”或者“3月份有几个产品型号产生了销量”。这个时候很多人本能地写 COUNTIFS却忘了 COUNTIFS 的计数规则是“符合条件的行数”重复出现同一个客户会被重复计算。比如上海区的一位客户成交了5笔COUNTIFS 会给你记5可你想要的可能是记1。SUMIFS 也一样它只能对满足条件的数值求和根本不去重。换句话说条件计数、条件求和都是“按行”玩的去重计数是“按值”玩的。我们要自己设计公式逻辑让公式先判断行是否满足条件再判断同一个值是否已经出现过。只有理解了这一步才能看懂 SUMPRODUCT 版公式里的乘法逻辑。有些朋友会问那为什么不用 Excel 自带的“删除重复值”功能因为删除重复值会物理删除行破坏原始台账。我们做报表讲究一个“不动源数据”所以要用公式动态计算源数据一更新结果也跟着更新。2. 三套主力公式从低配到高配围绕按条件去重计数我给一个结论没有一套公式能覆盖所有 Excel 版本选公式之前先确认自己用的是经典版还是 365/Microsoft 365或者 WPS 新版。下面三套方案分别适合不同场景建议按需取用而不是只背一个。2.1 低配方案COUNTIF 辅助列适合任何版本低版本 Excel 没有 UNIQUE 这类数组原生函数我推荐用辅助列。虽然看起来多占一列但胜在稳定、可调试。假设A列是客户B列是地区要统计“上海”这个条件下的去重客户数。第一步在C2写入IF(B2上海, COUNTIFS($A$2:$A2, A2, $B$2:$B2, 上海), 0)这是关键写法。注意 $A$2:$A2 这种“锁定区域起点终点不锁”的写法就是让范围随着公式下拉不断扩大的“累计区域”。当公式拉到第10行它统计的是 A2:A10 中与当前客户相同且地区为“上海”的出现次数。如果这是上海区这个客户的第1次出现COUNTIFS 会返回1当这一行出现第2次、第3次时返回2、3只有第一次显示为1其他都大于1。然后在辅助列再加一层判断让重复记录只在第1次出现的位置保留目标值IF(COUNTIFS($A$2:$A2, A2, $B$2:$B2, 上海)1, 1, 0)最后对C列求和得到的就是上海区的不重复客户数。这个思路看着土但它逻辑简单而且可以随时点开C列看哪一行被算过、哪一行没被算排查问题非常方便。还有一种变体是用 SUMPRODUCT 直接实现类似逻辑不用辅助列但那种写法一旦条件复杂调试成本就高了。我个人建议如果你只是偶尔做一次统计辅助列不丢人反而能减少“公式算不清楚”的焦虑。2.2 中配方案SUMPRODUCT COUNTIF单公式搞定不需要辅助列的话可以用经典数组组合。以“统计上海地区不重复客户”为例公式如下SUMPRODUCT((B2:B100上海) / COUNTIFS(A2:A100, A2:A100, B2:B100, B2:B100))拆解一下第一部分 (B2:B100上海) 生成一组由 TRUE/FALSE 组成的数组TRUE 在 Excel 计算时等于1FALSE 等于0。第二部分 COUNTIFS(A2:A100, A2:A100, B2:B100, B2:B100)是对每一行数据分别统计“在A列同样客户、B列同样地区”的组合出现了多少次。两者相除只有满足“上海”条件的行才会参与计数同一客户在上海区每出现一次都会被拆成 1/总次数加起来还是1。这样就把“满足条件”和“去重”两个动作叠在了一起。这个公式写起来比别人分享的 SUMPRODUCT((B2:B100上海)*(1/COUNTIF(A2:A100,A2:A100))) 更严谨一点因为第一个版本没有把“地区条件”放进 COUNTIF 里去重当同一个客户出现在上海和北京时容易误伤。用 COUNTIFS 双条件统计是稳妥的。不过如果数据量超过几千行SUMPRODUCT 这种数组运算会让 Excel 变慢使用时要心里有数。2.3 高配方案UNIQUE FILTER365和WPS新版强烈推荐如果你用的是 Office 365、Excel 2021 或 WPS 较新版本我强烈建议直接用动态数组函数。统计上海不重复客户写起来像人话COUNTA(UNIQUE(FILTER(A2:A100, B2:B100上海)))这个公式的顺序是FILTER 先把 A 列中满足“B列等于上海”的客户名单筛出来UNIQUE 再把这份名单里的重复项去掉COUNTA 数一下名单里有多少个非空值。三个函数各管一件事直来直去不用求倒数不用除零兜底。更高级一点的写法是可以让结果是动态数组直接在单元格里溢出显示所有不重复客户列表UNIQUE(FILTER(A2:A100, B2:B100上海))当源数据变化结果区域自动更新比旧版函数方便太多。唯一要注意的是如果你的 Excel 版本不支持动态数组那这个公式会报错所以别在别人电脑上乱演示。3. 多条件去重计数与组合场景实际业务远没有“上海”一个条件这么简单。很多报表要按月份、地区、渠道、品类同时过滤这时候公式需要再升级。理解核心逻辑后写起来其实不难就是往数组条件里“加乘法”。3.1 多条件版本从单条件推广到多重筛选需求场景变成统计 3月份、华东地区、线上渠道 的不重复客户数。SUMPRODUCT 版本可以写成SUMPRODUCT((C2:C1003月) * (D2:D100华东) * (E2:E100线上) / COUNTIFS(A2:A100, A2:A100, C2:C100, C2:C100, D2:D100, D2:D100, E2:E100, E2:E100))我把原数据列位置假设一下A客户C月份D地区E渠道。这个公式和单条件版本结构一样只不过条件部分从一组变成了三组。COUNTIFS 里要把“客户”和所有“条件列”都作为去重维度目的是判断“同一个人、同一个月、同一个地区、同一个渠道”这一组合一共出现了多少次。分母计算出的就是完整组合的次数分子上的条件判断确保我们只计数符合条件的行。UNIQUEFILTER 的多条件版本更直白COUNTA(UNIQUE(FILTER(A2:A100, (C2:C1003月) * (D2:D100华东) * (E2:E100线上))))注意 FILTER 的条件区域之间要用乘号连接不能用逗号。用乘号等于执行“逻辑与”三个条件同时满足才返回对应行。有的朋友刚学动态数组习惯写 FILTER(A2:A100, C2:C1003月, D2:D100华东)那是错误用法FILTER 的第二个参数只有一个条件数组多条件必须合成一个。3.2 按关键词匹配的条件去重计数有时候条件不是“等于”而是“包含某个关键词”比如统计“客户名称里包含‘科技’二字的客户在华北地区有多少个不重复”。这种需求本质是把精确匹配改成模糊匹配核心函数换成 ISNUMBER SEARCH/FIND。SUMPRODUCT 版本SUMPRODUCT((ISNUMBER(SEARCH(科技, A2:A100)) * (B2:B100华北)) / COUNTIFS(A2:A100, A2:A100, B2:B100, B2:B100))SEARCH(科技, A2:A100) 会在每个客户名称中查找“科技”找得到就返回一个位置数字找不到返回错误值。ISNUMBER 再把“是数字”的变成 TRUE这样“包含关键词”的条件就转成了逻辑数组。这里我特意用 SEARCH 而不是 FIND因为 SEARCH 不区分大小写且支持通配符对中文来说两者差不多但 SEARCH 对英文大小写更友好。UNIQUEFILTER 版本COUNTA(UNIQUE(FILTER(A2:A100, ISNUMBER(SEARCH(科技, A2:A100)) * (B2:B100华北))))FILTER 的条件参数支持数组运算ISNUMBER(SEARCH(...)) 在 FILTER 里能正常使用返回的也是逻辑值数组。我在实际处理客户名、产品名时这类“包含匹配”需求非常多。唯一要注意的是 SEARCH 支持通配符如果客户名里有星号、问号这些字符可能会误匹配需要转义。3.3 数值区间和日期区间条件订单金额、销售日期也是高频条件。比如统计“3月份、订单金额大于500元的不重复客户数”。这里重点是日期条件的写法。SUMPRODUCT 版本SUMPRODUCT((TEXT(C2:C100,YYYY-MM)2024-03) * (D2:D100500) / COUNTIFS(A2:A100, A2:A100, C2:C100, C2:C100))我把列再换一下A客户C日期D金额。TEXT(C2:C100,YYYY-MM) 的作用是把日期统一转成“年-月”格式然后和“2024-03”比较。有些朋友习惯用 MONTH 函数判断月份但在跨年时会出问题比如 2024-03 和 2025-03 的 MONTH 都是3。用 TEXT 或者直接用 DATE 区间判断更稳妥。用 UNIQUEFILTER 时写日期区间建议用“开始日期日期结束日期”的逻辑COUNTA(UNIQUE(FILTER(A2:A100, (C2:C100DATE(2024,3,1)) * (C2:C100DATE(2024,3,31)) * (D2:D100500))))日期不能用“2024/3/1”这种文本直接比较除非你确认单元格是日期格式。用 DATE 函数生成标准日期值能避免很多隐性 bug。4. 新手常踩的坑和排查实录好公式写出来只是第一步真正让人头大的是公式明明看着对结果却不对。这里我把多年处理 Excel 表格时踩过和见过的高频问题整理一下。这些问题网上散落在各种帖子评论区里我自己也逐一试过解法。4.1 公式下拉失效、结果不正确多半是数组公式或动态数组的问题有朋友反馈“office2019 excel 公式下拉失效”或者低版本里写完 SUMPRODUCT 公式后向下填充发现每个格子都返回一样的结果。这个现象通常是两个原因一个是当前表格手动计算模式。Excel 如果设置了“手动计算”公式下拉后不会自动重算按 F9 强制重算或者切换成自动计算就好了。很多人不知道这一点以为公式坏了先把“公式”选项卡里“计算选项”改成“自动”再检查问题。另一个原因更隐蔽低版本里的公式其实是数组公式需要按 CtrlShiftEnter 结束编辑不能直接回车。如果你直接在单元格里输入 SUMPRODUCT(...) 然后回车Excel 老版本可能会把它当普通公式对待结果就乱了。如果是 365 或者 WPS 新版动态数组函数不需要专门按三键但旧版必须用数组形式录入。这个差异经常让人崩溃建议到任意一台机器上写公式前先确认版本。4.2 计算结果少算或多算要检查隐藏字符、空白单元格和重复表头有一类特别常见的问题公式结果比实际少了几个。排查时要先看数据源里有没有不可见字符。比如从系统导出的客户名称可能带了空格、换行符或全角空格看起来都是“上海”实际上一个是“上海”一个是“上海 ”多了空格COUNTIFS 就会认为它们是两个不同的值。解决办法是用 TRIM 函数先清洗比如在辅助列加 TRIM(A2)或者用查找替换把空格去掉。空白单元格也会干扰分母。COUNTIFS 对空白单元格的统计结果不同如果条件区域里有空行分母可能返回0导致公式出现 #DIV/0! 错误。常见的兜底写法是SUMPRODUCT((B2:B100上海) / IF(COUNTIFS(A2:A100, A2:A100, B2:B100, B2:B100)0, 1, COUNTIFS(A2:A100, A2:A100, B2:B100, B2:B100)))不过这种写法有点丑。我更推荐把数据区域精确设置为“有数据的区域”或者用 UNIQUEFILTER 版本因为 FILTER 对空行会自然过滤。另一个很坑的是表格里出现“总计”行或合并单元格。合并单元格会把 COUNTIFS 的行数判断搞乱建议做数据前先取消合并单元格否则去重计数的结果很难查。4.3 复制粘贴失效、公式不更新可能是格式或外部链接问题很多人在工作中遇到过“excel ctrl v 失效”或者“excel粘贴快捷键用不了”的情况。这个跟公式本身没直接关系但特别影响操作效率。我遇到过的可能原因有Excel 打开了多个工作簿当前工作簿被某个加载项拖慢或者表格里存在大量条件格式、数据验证导致粘贴时卡死还有可能是剪贴板里被别的程序占用。换个思路可以先试“开始”选项卡里的“选择性粘贴”或者清除全部格式后粘贴纯文本。公式不更新还经常因为链接了外部工作簿。如果你的表里用了外部引用比如 SUMPRODUCT(...) 的源数据来自另一个没打开的文件Excel 会在不重算或拒绝更新时给出缓存结果。处理这类问题建议把源数据导入到当前表或者打开源文件后再重算。还有人问“excel导入数据库”“python写入excel”其实都是数据在 Excel 和外部系统之间搬运的问题务必要处理好日期、数字格式再导防止导入后条件匹配不上。4.4 大数据的卡顿问题SUMPRODUCT 跑不动怎么办如果数据有50万行SUMPRODUCT 这种数组公式会卡到怀疑人生。我个人实测几万行内还行几十万行基本不建议用。这时候有两条路一是先把数据清洗成“透视表可处理”的结构用透视表“值字段设置为非重复计数”来替代公式二是缩减公式作用范围不要整列 A:A只选 A1:A50000能快不少。如果你是在做报表自动化建议把明细数据导入数据库或专业分析工具Excel 只负责展示最终结果。在 Excel 自带的“插入透视表”里如果数据模型加载过就可以在值字段设置里选“非重复计数”这本质上是一种软件级去重计数不写公式也能做到适合不想折腾数组公式的朋友。唯一要注意的是普通透视表默认没有“非重复计数”选项需要勾选“将此数据添加到数据模型”。5. 实战案例月度订单按客户去重计数前面讲了不少原理接下来走一遍完整案例。假设你是一家消费品公司的销售助理手里有一份3月份订单明细表列结构是订单号、客户名称、所属区域、订单金额、订单日期。领导要你统计“各区域在3月份分别有多少个不重复成交客户”你需要在同一个报表里展示华东、华南、华北、西南这几个区域的去重客户数。5.1 数据整理与需求拆解先把源数据整理规范客户名称列不能有空格订单日期最好是标准日期格式区域列必须统一名称比如“华东”不要出现“华东部”“华东区”等别名。我习惯先把原始明细表复制一份到“数据清洗”工作表用 TRIM、TEXT、IFERROR 做一遍清洗然后在干净数据上写公式。这种“源数据不动、副本处理”的思路能避免失误后原始台账被破坏。需求拆解后不难发现这其实是一个“分组条件下的去重计数”本质上不是单一条件而是“区域”字段的每个值分别作为条件。最偷懒的办法有两种一是用 Excel 透视表把“区域”拖到行区域把“客户名称”拖到值区域并设置为“非重复计数”二是写动态数组公式把区域列表和去重计数一次性全部算出来。5.2 动态数组公式直接输出各区域不重复客户数如果你的 Excel 支持动态数组可以用 UNIQUEFILTER 配合 BYROW 之类的数组函数甚至可以同时输出区域名和计数。不过 BYROW 比较复杂我推荐更直观的组合先用 UNIQUE 提取区域列表再用每个区域作为条件分别计数。比如在 H2 输入UNIQUE(B2:B100)这会自动列出所有不重复区域。然后在 I2 输入COUNTA(UNIQUE(FILTER($A$2:$A$100, $B$2:$B$100H2)))下拉填充或者让 Excel 自动扩展区域新版支持 H2# 这种引用方式。这里的 A2:A100 是客户名称B2:B100 是区域。当 H2 是“华东”时公式先筛选出所有“华东”的客户再去重计数。由于 H2 每种区域只有一个值这个公式拉下去就能得到每个区域的去重客户数。如果你的 Excel 支持 VSTACK/HSTACK还可以把区域列表和计数结果合成一张自动更新的报表不过普通用途没必要上这么高的复杂度。低版本用户就在前面说的辅助列方案上操作加一列“首次出现标记”用 COUNTIFS 判断某个客户在对应区域里是否第一次出现最后用 SUMIFS 按区域求和。SUMIFS 在这里不是做条件去重而是对“首次出现标记”为1的行按区域求和所以它负责的是“区域分组汇总”去重逻辑由辅助列完成。这个思路逻辑链清晰也方便核对。5.3 结果解析与手动核验公式算出来之后一定要做手动核验我工作里吃过亏公式看着对结果错得离谱最后查了半天是区域名称里有全角空格。核验方法很简单选中华东区域的所有行复制客户列到空白列用 Excel“数据—删除重复值”功能查看剩余行数和公式结果对比。如果两边一致说明公式正确不一致就顺着辅助列逐行检查。这里分享一个“SUMIFS 和条件去重计数结合”的经验如果报表还要带上销售额同一个公式里可以同时算出去重客户数和总金额。总金额直接用 SUMIFS 按区域和日期区间求和不需要去重去重客户数用上面公式。两个指标放在同一行最终效果是一张“区域维度成交概览表”这在实际工作中非常受欢迎。6. 我的几点实操心得最后不写教科书式的总结就分享几个我在实际工作中反复被验证过的体会。这些经验不少是踩坑换来的希望你能少走几步。6.1 公式选型要根据 Excel 版本走不要盲目追求高配我现在写表格前一定会先确认对方电脑里的 Excel 版本。如果对方是 WPS 2019 或 Office 2016就老老实实写 SUMPRODUCT 或辅助列如果对方用的是 Microsoft 365 且开启了动态数组UNIQUEFILTER 的体验会远好于老公式。盲目教别人高配函数很可能在对方电脑上输出 #NAME? 错误。这一点说小是小说大能让整张报表报废。我的习惯是刚入门的新公式先在自己电脑上验证再用最低兼容版本做一份“保底”公式两边都能跑才算完。6.2 辅助列不一定丑它是排查问题的好朋友很多教程把辅助列说得上不了台面我反而觉得辅助列在业务报表中非常实用。它不仅让公式逻辑透明还能在结果异常时快速定位辅助列哪一行不符合预期一眼就能看出来。我处理复杂需求时经常先加两列辅助列算清楚后再决定要不要把它们隐藏。有时候隐藏掉会让报表美观但打印时如果担心领导看到乱七八糟的公式可以在“视图”里取消勾选网格线辅助列放在报表右边区域不打印出来就行。说到底干净优雅和实用稳定并不矛盾业务处理讲究“能跑明白”优先。6.3 把去重逻辑封装成模板一劳永逸如果你频繁要做“按条件去重计数”建议做一张自己的模板表列好参数区、明细区、结果区公式提前写好并预留一个“版本说明”。每次新数据进来只需要把明细粘贴到指定区域结果区自动更新。这个思路其实和我之前处理“excel处理框架”类需求很像把公式固定下来把变化留成参数而不是每次从零开始写函数。时间一长你会发现去重计数只是一个小小的起点同样的逻辑可以迁移到库存盘点、会员统计、渠道分析等几乎所有场景里。就我个人的使用习惯而言“按条件去重计数”并不是某个高深函数的炫技现场而是 Excel 里最考验逻辑拆解的统计场景之一。你只要想清楚“哪一列要被去重、哪一列是条件、重复计数按什么组合判断”这三件事公式就只是顺手的事。希望这篇内容能帮你把表格里的“重复项”驯服别再被领导追问“这客户数到底哪来的”时手忙脚乱。
返回列表