WITH t_tag_level as (
    SELECT uid
            ,exam_id
            ,CASE 
                WHEN score >=90 THEN "优"
                WHEN score >=75 THEN "良"
                WHEN score >=60 THEN "中"
                WHEN score <60 THEN "差"
            END AS score_grade
            ,count(*) over(partition by level) as total
    FROM exam_record
    JOIN user_info USING(uid)
    WHERE score IS NOT NULL
)

SELECT level
        ,score_grade
        ,ROUND(COUNT(score_grade) / total, 3) AS ratio
FROM user_info
JOIN t_tag_level USING(uid)
GROUP BY level,score_grade
ORDER BY level DESC, ratio DESC

  • ,count(*) over(partition by level) as total是本部分重点