SQL Server中COUNT与COUNT(DISTINCT)分组后结果异常问题
分组查询COUNT(DISTINCT)结果异常的排查方向
- 确认分组内数据的实际情况:全局统计有重复UserName,但这些重复项可能分散在不同TenantId分组中——比如同一个UserName属于不同租户,那每个租户的分组里该UserName只出现一次,自然
COUNT(DISTINCT [UserName])等于COUNT([UserName])。可以单独查询某个怀疑有重复的租户,看具体数据:SELECT [UserName] FROM [UsersTable] WHERE [TenantId] = '目标租户ID' ORDER BY [UserName] - 检查隐式字符差异:看似相同的UserName可能存在肉眼不可见的差异,比如前后空格、全角/半角空格、换行符,或者SQL Server排序规则区分大小写导致的大小写差异(比如
'Alice'和'alice'被视为不同值)。用以下语句排查:
对比同一租户下UserName的长度和字节数,就能发现是否存在表面一致但实际不同的内容。SELECT [TenantId], [UserName], LEN([UserName]), DATALENGTH([UserName]) FROM [UsersTable] ORDER BY [TenantId], [UserName] - 排查NULL值影响:
COUNT([UserName])和COUNT(DISTINCT [UserName])都会忽略NULL值。如果某个分组内的UserName没有NULL,且所有非NULL值都不重复,两个计数结果自然相等。可以查看分组内的NULL情况:SELECT [TenantId], COUNT(CASE WHEN [UserName] IS NULL THEN 1 END) AS NullCount FROM [UsersTable] GROUP BY [TenantId] - 更新表统计信息:如果表的统计信息过期,查询优化器可能生成错误的执行计划,导致结果异常。执行以下语句更新统计信息后重新查询:
UPDATE STATISTICS [UsersTable]; - 检查分组字段是否正确:确认
GROUP BY [TenantId]的字段拼写无误,若数据库使用区分大小写的排序规则,字段大小写不一致可能导致分组异常(不过SQL Server默认不区分大小写)。
内容的提问来源于stack exchange,提问作者Daniel_Kamel
相关产品推荐
相关产品推荐

