Menu

Excel 统计不重复值:UNIQUE 和 COUNTIF 公式

=COUNTA(UNIQUE(A2:A9)) 统计 A2:A9 中有多少个不同的值。旧版 Excel 使用 =SUMPRODUCT(1/COUNTIF(A2:A9,A2:A9))。还能统计只出现一次的值、按条件统计,以及跳过空白。

本页的每张表格都是实时的:修改数字或公式,就会重新计算。

=COUNTA(UNIQUE(A2:A9)) 统计 A2:A9 中有多少个不同的值。UNIQUE 把每个值返回一次,COUNTA 统计这个列表。它需要 Excel 2021 或 Microsoft 365;旧版本的做法见下文。

不同的客户
D2
ABCD
1CustomerUnique listCount
2AnaAna5
3BenBen
4AnaCara
5CaraDan
6BenEva
7Dan
8Ana
9Eva
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

八笔订单来自五位客户。C2 溢出显示 UNIQUE 得到的名字列表,让你看清统计的是什么;D2 则不需要把列表放在表格上就能直接计数。把 A9 改成 Ana,计数降为 4;输入一个新名字,计数就会增加。

UNIQUE 不区分大小写,所以 Ana 和 ana 算同一位客户。

在旧版 Excel 中统计不重复值

Excel 2019 及更早版本没有 UNIQUE。经典公式是:

=SUMPRODUCT(1/COUNTIF(A2:A9,A2:A9))

COUNTIF 用整个区域作为条件时,会为每一行返回该行的值出现了多少次。出现 3 次的名字在它的每一行都得到 3,于是 1/3 被加三次,这个名字加起来正好是 1。B 列显示每一行的次数,C 列显示对应的分数。

1/COUNTIF 的原理
E2
ABCDE
1CustomerTimes1/TimesCount
2Ana30.335
3Ben20.505.00
4Ana30.33
5Cara11.00
6Ben20.50
7Dan11.00
8Ana30.33
9Eva11.00
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

Ana 的三行各加 0.33,Ben 的两行各加 0.50,三个只出现一次的名字各加 1:总共是 5,与辅助列 SUM 的结果相同。在几万行的数据上,这个公式很慢,因为 COUNTIF 每一行都要扫描一遍整个区域;UNIQUE 没有这个开销。

去重计数与唯一值:只出现一次的值

“唯一”这个说法可以指两种不同的计数。上面那种统计的是去重后的值:每个名字算一次。另一种统计的是正好出现一次的值,例如只下过一次单的客户。UNIQUE 把第三个参数 exactly_once 设为 TRUE 就能做到。

去重计数与只出现一次
D3
ABCD
1CustomerCountResult
2AnaDistinct5
3BenExactly once3
4AnaExactly once, older Excel3
5Cara
6Ben
7Dan
8Ana
9Eva
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

去重后有五位客户,但其中只有三位(Cara、Dan 和 Eva)只下过一次单。旧版 Excel 的写法统计 COUNTIF 正好为 1 的行。如果每个值都有重复,带 exactly_once 的 UNIQUE 会返回 #CALC!,COUNTA 会把这个错误算作 1;SUMPRODUCT 版本则返回 0。

按条件统计不重复值

要统计某个地区有多少位不同的客户,先筛选出这些行,再统计剩下的内容。FILTER 保留 North 行,UNIQUE 去掉重复项。

各地区的不同客户数
E2
ABCDE
1CustomerRegionRegionCustomers
2AnaNorthNorth3
3BenSouthSouth3
4AnaNorthNorth, older Excel3
5CaraNorth
6BenNorth
7DanSouth
8AnaNorth
9EvaSouth
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

North 有五笔订单,来自三位客户:Ana、Cara 和 Ben。E3 用同样的方法统计 South。E4 是适用于 Excel 2019 及更早版本的写法:COUNTIFS 统计每个“客户和地区”组合,条件只保留 North 的分数。

如果没有任何行匹配,FILTER 返回 #CALC!,而 COUNTA 会把这个错误算作一个值:在 D2 中输入 West,E2 显示 1 而不是 0。用 IFERROR 包住公式也没用,因为 COUNTA 本身不返回错误。改为统计结果的行数,它会把错误传递出来:=IFERROR(ROWS(UNIQUE(FILTER(A2:A9,B2:B9="West"))),0) 返回 0。

统计不重复值并忽略空白

区域中的空单元格会多出一个“值”。UNIQUE 把它返回为 0,COUNTA 也会统计这个 0,所以对于 Ana、空单元格、Ben、Ana、空单元格、Cara 和 Ben,Excel 给出:

=COUNTA(UNIQUE(A2:A8))    4   three names plus the 0 for the empty cells

在旧公式中,空行会让 COUNTIF 返回 0,于是 1/0 得到 #DIV/0!。先去掉空白:

有空隙的区域
D2
ABCD
1CustomerFormulaCount
2AnaSkip blanks3
3Older Excel3
4Ben
5Ana
6
7Cara
8Ben
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

两个公式都统计出三位客户。带 A2:A8<>"" 的 FILTER 在 UNIQUE 处理之前就去掉了空单元格。在旧公式中,A2:A8&"" 把每个空单元格变成空字符串,这样 COUNTIF 永远不会返回 0,而 (A2:A8<>"") 让这些行的权重为 0。

练习:统计产品种类

轮到你了:有多少种产品?
E2
ABCDE
1OrderProductCountResult
21001AppleProducts
31002Pear
41003Apple
51004Plum
61005Pear
71006Apple
81007Plum
91008Fig
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

轮到你了: 统计 B2:B9 中出现了多少种不同的产品。在 E2 中写公式。

根据你的 Excel 版本选择公式

统计内容Excel 365 / 2021Excel 2019 及更早版本
去重后的值=COUNTA(UNIQUE(A2:A9))=SUMPRODUCT(1/COUNTIF(A2:A9,A2:A9))
只出现一次的值=COUNTA(UNIQUE(A2:A9,,TRUE))=SUMPRODUCT(--(COUNTIF(A2:A9,A2:A9)=1))
按条件去重计数=COUNTA(UNIQUE(FILTER(A2:A9,B2:B9="North")))=SUMPRODUCT((B2:B9="North")/COUNTIFS(A2:A9,A2:A9,B2:B9,B2:B9))
去重计数并跳过空白=COUNTA(UNIQUE(FILTER(A2:A9,A2:A9<>"")))=SUMPRODUCT((A2:A9<>"")/COUNTIF(A2:A9,A2:A9&""))

在数据透视表中,值汇总方式“非重复计数”不用公式就能完成同样的工作,但前提是创建数据透视表时勾选了“将此数据添加到数据模型”。如果想删除重复项而不是统计它们,请参阅删除重复项。

常见问题

如何在 Excel 中统计不重复值?

在 Excel 365 或 2021 中,使用 =COUNTA(UNIQUE(A2:A9)):UNIQUE 把每个值列出一次,COUNTA 统计这个列表。在旧版本中使用 =SUMPRODUCT(1/COUNTIF(A2:A9,A2:A9))。

如何统计只出现一次的值?

把 UNIQUE 的第三个参数 exactly_once 设为 TRUE:=COUNTA(UNIQUE(A2:A9,,TRUE))。对于 Ana、Ana、Ben,结果是 1,因为只有 Ben 只出现了一次。在 Excel 2019 及更早版本中使用 =SUMPRODUCT(--(COUNTIF(A2:A9,A2:A9)=1))。

如何按条件统计不重复值?

先筛选,再计数:=COUNTA(UNIQUE(FILTER(A2:A9,B2:B9="North"))) 统计 North 行中不同客户的数量。如果没有任何行匹配,COUNTA 会把 FILTER 的 #CALC! 错误算作 1,所以可能出现这种情况时,请使用 =IFERROR(ROWS(UNIQUE(FILTER(A2:A9,B2:B9="North"))),0)。

如何统计不重复值并忽略空白单元格?

在 UNIQUE 之前去掉空白:=COUNTA(UNIQUE(FILTER(A2:A9,A2:A9<>"")))。在旧版 Excel 中,=SUMPRODUCT((A2:A9<>"")/COUNTIF(A2:A9,A2:A9&"")) 会跳过空白。

Coddy 编程语言插图

和 Coddy 一起学编程

开始