SQL技术求助:按用户积分总和取TOP10分组却出现重复条目
解决分组重复条目问题:获取积分总和TOP10分组的正确SQL
你的问题根源出在GROUP BY子句的错误使用上——你把users表的points字段加入了分组依据,这会导致同一个分组下的每个用户因为points值不同而被拆分成单独的分组,自然就出现了重复的分组条目。
修正后的SQL语句如下:
SELECT TOP 10 [groups].[name], [groups].[id], SUM(users.points) AS total_points FROM [groups] INNER JOIN [users] ON [groups].[id] = [users].[group_id] GROUP BY [groups].[id], [groups].[name] ORDER BY total_points DESC;
关键修正点说明:
- 移除
GROUP BY中的points:我们的分组逻辑是按groups表的唯一标识(id和name)来聚合用户积分,不需要把用户的points字段加入分组依据,这样同一个分组下的所有用户积分会被正确汇总成一条记录。 - 优化别名(可选但推荐):把聚合结果的别名改成
total_points,避免和users表的points字段混淆,让SQL逻辑更清晰。
如果需要统计**所有分组(包括没有用户的分组)**的积分总和(无用户的分组积分为0),可以改用LEFT JOIN并处理空值:
SELECT TOP 10 [groups].[name], [groups].[id], SUM(ISNULL(users.points, 0)) AS total_points FROM [groups] LEFT JOIN [users] ON [groups].[id] = [users].[group_id] GROUP BY [groups].[id], [groups].[name] ORDER BY total_points DESC;
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

