select level, score_grade, round(count(score_grade) / total, 3) as ratio from ( select (case when score >= 90 then '优' when score >= 75 then '良' when score >= 60 then '中' else '差' end) as 'score_grade', count(*) over ( partition by level ) as total, level from user_info left join exam_record using(uid) where score is not null )main group by level, score_grade order by level desc ,ratio desc
时间: 2024-02-10 14:19:01 浏览: 71
Event filter with query SELECT * FROM __InstanceModificationEvent WITHIN
这是一个 SQL 查询语句,它从 user_info 和 exam_record 两个表中联合查询,计算出每个用户的 score_grade,并按照 level 和 score_grade 进行分组,最后按照 level 和 ratio 进行排序。
具体来说,这个查询语句的执行过程如下:
1. 首先,从 user_info 表中获取 uid 和 level 字段,从 exam_record 表中获取 uid 和 score 字段,并使用 left join 进行联合查询。
2. 接着,在 select 语句中,使用 case when 语句对 score 进行分类,将其转换为优、良、中、差四个等级,并计算每个等级的数量。同时,使用 count(*) over (partition by level) as total 计算每个 level 的总数。
3. 然后,在 from 子句中,将上一步得到的结果作为一个子查询,命名为 main。同时,将 level 字段也加入子查询中。
4. 最后,在 group by 子句中,按照 level 和 score_grade 进行分组,并使用 round(count(score_grade) / total, 3) as ratio 计算出每个等级的比例。最后,按照 level 和 ratio 进行排序,其中 level 按照降序排列,ratio 按照降序排列。
总的来说,这个查询语句的目的是统计每个 level 中各个 score_grade 的比例,并按照比例进行排序。与前一个查询语句相比,这个查询语句没有过滤掉 score_grade 为空的记录,而是过滤掉了 score 为空的记录,并将 level 字段也加入了子查询中。
阅读全文