分组基操(一)
万丈高楼平地起,不要小看了任意一根稻草!
现有一个学生简介表,记录了每一个学生的年龄,性别,学校,以及30天内活跃天数,发帖数量,回答数量等信息,数据如下:

其中,gender 性别包括 male 男,female 女,active_days_within_30 是30天内活跃天数,question_cnt 是发帖数量,answer_cnt 是回答数量
需求一
现在论坛需要对每个学校每种性别的学生人数以及活跃情况做分析,具体来说,就是统计每个学校的每种性别一共有多少人,这些人30天内平均活跃天数,平均发帖数量和平均回答数量
这是一个基本的多字段分组,分组之后的聚合统计。avg 与 sum 不能嵌套,所以需要用除法计算,再使用 round 函数四舍五入保留一位小数。
SELECT university, gender, count(id) user_num, ROUND(sum(active_days_within_30) / count(id), 1) avg_active_day, ROUND(sum(question_cnt) / count(id), 1) avg_question_cnt FROM user_profile GROUP BY university, gender
结果如下所示:

其中,user_num 统计了分组后的人数,sum 后的总发帖和总活跃天数除以人数即是平均值,再使用 round 取舍即可
再来点基操中的基操,count 1 = count * 不去空,count col 去空。
需求二
现在论坛想要知道每个学校的平均发帖量和回帖量,并找出平均发帖量小于 5 和平均回帖量小于 20 的学校,然后重点运营。另外,平均值四舍五入保留3位小数。
显然,分组学校后需要对统计的结果进行筛选,having 就派上用场了
select university, round(sum(question_cnt)/count(1),3) avg_question_cnt, round(sum(answer_cnt)/count(1),3) avg_answer_cnt from user_profile group by university having avg_question_cnt < 5 or avg_answer_cnt < 20
结果如下所示:

浙公网安备 33010602011771号