如何用SQL统计圣诞竞赛会员参与次数的分布情况?
解决圣诞竞赛参与频次统计问题
你已经找对了方向——先算出每个会员的参与次数,现在只需要多做一步聚合统计,就能得到你想要的「参与次数 | 对应会员数量」格式结果了。
基础解决方案(仅统计有会员的次数)
如果只需要展示实际有会员达到的参与次数对应的会员数,用嵌套查询就能实现:
SELECT participations AS `参与次数`, COUNT(*) AS `对应会员数量` FROM ( -- 内层查询:算出每个会员的总参与次数(每条记录对应一次参与) SELECT COUNT(*) AS participations FROM your_table_name -- 替换成你的实际表名 GROUP BY memberid ) AS member_participations -- 外层查询:按参与次数分组,统计每个次数对应的会员总数 GROUP BY participations ORDER BY participations ASC;
这个逻辑很直观:
- 内层子查询先对
memberid分组,把每个会员的记录数(也就是参与次数)算出来; - 外层查询再把这些次数作为分组依据,统计每个次数下有多少会员,最后按次数升序排列。
进阶解决方案:强制显示1-24所有次数(含0会员的情况)
因为竞赛持续24天,可能存在某些次数(比如17次)没有会员达到的情况。如果你希望完整列出1到24次的所有行(没有会员的次数显示0),可以用递归CTE生成1-24的数字序列,再和统计结果做左连接:
WITH numbers AS ( -- 生成1到24的连续数字序列 SELECT 1 AS n UNION ALL SELECT n + 1 FROM numbers WHERE n < 24 ) SELECT numbers.n AS `参与次数`, -- 用COALESCE把空值转换成0,处理没有会员的次数 COALESCE(member_counts.对应会员数量, 0) AS `对应会员数量` FROM numbers LEFT JOIN ( -- 这里复用基础方案的统计逻辑 SELECT participations, COUNT(*) AS `对应会员数量` FROM ( SELECT COUNT(*) AS participations FROM your_table_name GROUP BY memberid ) AS member_participations GROUP BY participations ) AS member_counts ON numbers.n = member_counts.participations ORDER BY numbers.n ASC;
这样就能确保输出结果从1到24次完整覆盖,不会遗漏任何一个可能的参与次数。
最后记得把SQL里的your_table_name替换成你实际使用的数据表名称哦!
内容的提问来源于stack exchange,提问作者Roman Tisch
相关产品推荐
相关产品推荐

