SQL每日一练(9)


业务场景说明:
员工培训并考核 5 个科目,通过的要求如下:

其中 statistics、SQL、python、data_visualization 4 个科目为必考项,每个科目得分需 >= 60 分;

mathematics 不是必考项是加分项,对得分不做要求,>= 0 分;

5 个模块总分 >= 300 分。

原始表:exam_results

题目一:

若通过一次考核则视为人员考核通过,若考核通过则输出考核通过中总分最高的记录;

若考核未通过则输出考核未通过中总分最高的记录;

结果输出:员工 ID、人员姓名、statistics 得分、SQL 得分、python 得分、data_visualization 得分、mathematics 得分、总分、考核时间、最终考核结果(取值 pass/fail )。

题目二:
共有多少人通过考核?通过考核的人中,最高分、最低分分别是多少?其中最多考了几次?
示例回答 45 480 330 2

题目一思路:在表格中将查询的查询出来,需要注意pass需要各科都过60分,可以用case when 语句进行判断

employee_id employee_name statistics sql_score python data_visualization mathematics exam_date
1 张三 70 80 90 85 95 2023-01-15
1 张三 65 75 85 80 90 2023-03-20
2 李四 55 80 90 85 95 2023-02-10
2 李四 60 70 80 55 90 2023-04-05
3 王五 80 85 90 95 100 2023-01-20
4 赵六 50 50 50 50 50 2023-03-15
WITH t1 AS (
    SELECT
        employee_id,
        employee_name,
        statistics,
        sql_score,
        python,
        data_visualization,
        mathematics,
        (statistics + sql_score + python + data_visualization + mathematics) AS total_scores,
        CASE
            WHEN statistics >= 60 AND sql_score >= 60 AND python >= 60 
                AND data_visualization >= 60 AND (statistics + sql_score + python + data_visualization + mathematics) >= 300 
            THEN 'pass'
            ELSE 'fail'
        END AS final_result,
        ROW_NUMBER() OVER (PARTITION BY employee_id, final_result ORDER BY total_scores DESC) AS rk
    FROM exam_results
)
SELECT
    employee_id AS "员工ID",
    employee_name AS "人员姓名",
    statistics AS "statistics得分",
    sql_score AS "SQL得分",
    python AS "python得分",
    data_visualization AS "data_visualization得分",
    mathematics AS "mathematics得分",
    total_scores AS "总分",
    final_result AS "最终考核结果"
FROM t1
WHERE rk = 1
ORDER BY employee_id;

题目二思路:

在题目1的t1表上进行搜索即可 

-- 查询通过考核人数
SELECT
    COUNT(DISTINCT employee_id) AS 通过考核人数
FROM
    t1
WHERE
    final_result = 'pass'
-- 查询最高分和最低分
SELECT
    MAX(total_scores) AS 最高分,
    MIN(total_scores) AS 最低分
FROM
    t1
WHERE
    final_result = 'pass';
SELECT MAX(exam_count) AS 最多考试次数
FROM (
    SELECT employee_id, COUNT(*) AS exam_count
    FROM exam_results
    GROUP BY employee_id
) AS subquery;

你可能感兴趣的:(sql每日一练,sql,java,数据库)