SQL36 统计有未完成状态的试卷的未完成数和未完成率

题目主要信息:

  • 统计有未完成状态的试卷的未完成数 incomplete_cnt 和未完成率 incomplete_rate
  • 未完成率保留三位小数

思路拆解:

  • 判断试卷未完成的条件为 submit_time 是否为 NULL,此处通过 IF(submit_time IS NULL, 1, 0) 获取每个提交记录的未完成状态。知识点:IF, IS NULL
  • 对上述中间结果,基于 exam_id 维度做聚合统计,SUM(是否未完成) 可获得每个试卷的未完成总数,SUM(是否未完成) / COUNT(1) 可获得试卷的未完成率;通过 ROUND 函数保留三位小数。知识点:SUM, COUNT, GROUP BY, ROUND
  • 使用 HAVING 语句对计算完的结果进行过滤筛选,根据题意,我们要保留未完成数量大于 0 的所有结果。知识点:HAVING

代码:

SELECT
    exam_id,
    SUM(incomplete),
    ROUND(SUM(incomplete) / COUNT(1), 3) AS incomplete_rate
FROM
(
    SELECT
        exam_id,
        IF(submit_time IS NULL, 1, 0) AS incomplete
    FROM
        exam_record
) AS exam_info
GROUP BY
    exam_id
HAVING
    incomplete_rate > 0