如何通过单SQL查询获取分组的用户登录状态多维度统计数据
单次SQL查询获取分组用户登录统计数据
可以通过条件聚合函数结合多表关联,在一次查询中完成所有统计需求。核心思路是用CASE WHEN配合COUNT实现不同条件下的用户计数,再通过简单算术运算得到占比。
完整SQL查询语句
SELECT g.group_name AS 分组名称, COUNT(u.user_id) AS 用户总数, COUNT(CASE WHEN u.last_login IS NOT NULL THEN u.user_id END) AS 已登录用户数, COUNT(CASE WHEN u.last_login IS NULL THEN u.user_id END) AS 未登录用户数, ROUND( IFNULL( COUNT(CASE WHEN u.last_login IS NOT NULL THEN u.user_id END) / NULLIF(COUNT(u.user_id), 0), 0 ) * 100, 2 ) AS 已登录用户占比 FROM `group` g LEFT JOIN group_user gu ON g.group_id = gu.group_id LEFT JOIN `user` u ON gu.user_id = u.user_id GROUP BY g.group_id, g.group_name ORDER BY g.group_name;
关键部分说明
- 多表关联:使用
LEFT JOIN确保所有分组都能被统计(即使分组下没有用户),如果只需要统计有用户的分组,可改为INNER JOIN。 - 条件计数:
COUNT(u.user_id)统计分组下的总用户数(自动忽略NULL值,即未关联到用户的记录)COUNT(CASE WHEN u.last_login IS NOT NULL THEN u.user_id END)仅统计last_login不为空的用户,即已登录用户数- 未登录用户数也可以用
用户总数 - 已登录用户数替代,结果一致
- 占比计算:
NULLIF(COUNT(u.user_id), 0)避免分组用户数为0时出现除以0的错误IFNULL(..., 0)将空占比转为0,ROUND(..., 2)将结果保留两位小数并转为百分比格式
内容的提问来源于stack exchange,提问作者Shawn Northrop
相关产品推荐
相关产品推荐

