You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两个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次的国家"的总记录数:

  1. 子查询按Country分组,计算每个国家的出现次数country_count,并且只保留出现次数>1的分组(排除只出现1次的国家)。
  2. 外层查询把这些符合条件的country_count求和,得到的是所有属于"重复出现过的国家"的记录总数——比如某个国家出现5次,这5条记录都会被算入总和。

第二个查询的逻辑

这个查询的本质是统计"非首次出现的重复记录条数":

  1. count(Country)是Customers表中所有非空的Country记录总数。
  2. count(Distinct Country)是表中不同国家的数量(每个国家只算1次)。
  3. 两者相减得到的是:总记录数减去唯一国家数,也就是每个国家除了第一条之外的记录数之和——比如某个国家出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:12:08