SQL使用GROUP BY分组统计符合条件总数量返回多行结果如何解决
问题原因
- 你写的SQL添加了
GROUP BY mem.memid子句,数据库会先将关联后的数据按会员ID拆分成分组,每个分组对应一个会员,count(*)此时统计的是每个分组内的记录数(即单个会员的预订记录条数),因此最终会返回和符合条件的会员数量相等的行数(也就是你看到的30行),每行对应单个会员的统计值,而非你需要的符合条件的会员总数量。 - 额外优化提示:你用内连接关联
cd.bookings表本身就会自动过滤掉没有任何预订记录的会员,如果你没有需要排除「有预订但slot总和为0」的异常数据的需求,不需要额外加HAVING SUM(slots) >= 1的判断条件。
正确写法
写法1(更高效,无需分组)
直接统计去重后的会员ID即可:
SELECT COUNT(DISTINCT mem.memid) FROM cd.members AS mem INNER JOIN cd.bookings AS bks ON mem.memid = bks.memid
写法2(保留原有分组逻辑)
如果需要保留原有分组过滤的逻辑(比如确实需要判断slot总和是否达标),可以在外层嵌套一层统计总数:
SELECT COUNT(*) FROM ( SELECT mem.memid FROM cd.members AS mem INNER JOIN cd.bookings AS bks ON mem.memid = bks.memid GROUP BY mem.memid HAVING SUM(slots) >= 1 ) AS qualified_members
内容的提问来源于stack exchange,提问作者Tapan Das
相关产品推荐
相关产品推荐

