为何两个SQL重复值统计查询结果不同?(count与count(distinct))
两个SQL查询统计重复值结果不同的原因分析
问题描述
我不理解为何以下SQL查询可用于统计某字段的重复值:
select sum(country_count) from ( select Country, count(Country) as country_count from Customers group by Country having count(Country) > 1 );
返回结果为88
而另一个查询却无法实现该统计:
SELECT count(Country) - count(Distinct Country) FROM Customers;
返回结果为70
想请教这两个查询为何会产生不同结果?(注:这些查询可在W3Schools的trySQL界面运行,已执行得到上述结果,原本预期它们结果一致。)
核心差异:两个查询统计的是完全不同的"重复值"定义
第一个查询的逻辑
这个查询的本质是统计所有"出现次数超过1次的国家"的总记录数:
- 子查询按
Country分组,计算每个国家的出现次数country_count,并且只保留出现次数>1的分组(排除只出现1次的国家)。 - 外层查询把这些符合条件的
country_count求和,得到的是所有属于"重复出现过的国家"的记录总数——比如某个国家出现5次,这5条记录都会被算入总和。
第二个查询的逻辑
这个查询的本质是统计"非首次出现的重复记录条数":
count(Country)是Customers表中所有非空的Country记录总数。count(Distinct Country)是表中不同国家的数量(每个国家只算1次)。- 两者相减得到的是:总记录数减去唯一国家数,也就是每个国家除了第一条之外的记录数之和——比如某个国家出现5次,这里只会算5-1=4次。
简化例子验证差异
假设Customers表的Country字段数据如下:
| Country |
|---|
| Germany |
| Germany |
| Germany |
| France |
| France |
| China |
- 第一个查询:子查询得到
Germany(3)、France(2),求和后是3+2=5。 - 第二个查询:总记录数6,distinct国家数3,6-3=3。
两者的差异一目了然:第一个统计的是所有属于重复国家的记录,第二个统计的是"重复的次数"(即每个国家多出来的记录数)。
内容的提问来源于stack exchange,提问作者mvoln
相关产品推荐
相关产品推荐

