日常写代码经常会遇到数据统计的业务场景,分组查询 group by 结合 count 和 sum 的复杂语句写起来容易令人头大,在这里分享两个比较复杂的统计场景,提供详细分析思路和最终sql语句,希望能给大家带来帮助。
场景1:统计每个学生的加减分次数和总分
库表结构如下所示:
学生分数表:student_score
字段名 | 含义 | 字段类型 | 备注 |
---|---|---|---|
id | 自增编号 | bigint | |
student_name | 学生姓名 | varchar | |
score | 分数 | double | |
sort | 分数类型 | int | 1-加分;2-减分; |
is_delete | 删除标志位 | int | 默认为0; |
一上来不着急写 sql,先来分析一下:
因为统计的是每个学生的分数,所以根据学生名称 student_name 进行 group by 分组查询。
需要获取的字段包括 学生名称 student_name,加分次数 add_count,扣分次数 sub_count,总加分 add_score,总扣分 sub_score,其中,学生名称不需要计算,因此只需处理次数和分数。
我们知道,count() 主要用于求行的个数累计,所以当分数类型 sort 为 1,则增加加分次数,sort 为 2,则增加扣分次数;而 sum() 用于求和累加,因而使用 sum() 来计算总分,分数类型 sort 为 1,则加分,sort 为 2,则减分。
有了清晰的思路,sql就不难写了:
SELECT
student_name,
count(sort = 1 OR NULL) add_count,
count(sort = 2 OR NULL) sub_count,
sum(IF(sort