sql分教师统计出每个教师每门课及格人数和及格率,用一个sql完成
时间: 2023-05-26 13:01:10 浏览: 362
A:
```
SELECT
teacher, course,
SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) AS pass_count,
ROUND(SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) / COUNT(*) * 100, 2) AS pass_rate
FROM
grades
GROUP BY
teacher, course;
```
注:假设成绩表为 `grades`,包含字段 `teacher`(教师名)、`course`(课程名)、`score`(成绩)。其中 `CASE` 语句统计及格人数,`SUM` 函数累加及格人数,`COUNT` 函数统计总人数,计算及格率时需要用到 `ROUND` 函数保留两位小数。
相关问题
sqlserver编写一个事务:对优秀教师:增加工资500元,如果教师是助教,可以晋升为讲师。获得优秀教师的条件:至少担任两门课程;每门课程及格率100%,优秀率33%
下面是一个示例 SQL Server 事务,用于实现对优秀教师的奖励:
```
BEGIN TRANSACTION
UPDATE Teachers
SET Salary = Salary + 500
WHERE TeacherID IN (
SELECT TeacherID
FROM Courses
WHERE Grade >= 60
GROUP BY TeacherID
HAVING COUNT(*) >= 2
AND AVG(Grade) >= 80
AND SUM(CASE WHEN Grade >= 90 THEN 1 ELSE 0 END) >= COUNT(*) / 3
)
UPDATE Teachers
SET Title = '讲师'
WHERE TeacherID IN (
SELECT TeacherID
FROM Teachers
WHERE Title = '助教'
AND TeacherID IN (
SELECT TeacherID
FROM Courses
GROUP BY TeacherID
HAVING COUNT(*) >= 2
AND AVG(Grade) >= 80
AND SUM(CASE WHEN Grade >= 90 THEN 1 ELSE 0 END) >= COUNT(*) / 3
)
)
COMMIT TRANSACTION
```
上述代码中,我们首先使用 UPDATE 语句增加了那些符合要求的优秀教师的工资 500 元。具体地,我们使用了一个子查询来找到那些至少担任了两门课程,每门课程及格率都为 100% ,并且优秀率达到 33% 的教师。这个子查询首先使用了 GROUP BY 和 HAVING 子句来筛选出符合要求的教师,然后使用了 AVG 函数计算平均分数,使用了 SUM 函数计算成绩大于等于 90 分的学生数量,并使用 COUNT 函数计算总学生数。如果优秀率达到了 33% (也就是成绩大于等于 90 分的学生数量超过总学生数的三分之一),那么这个教师就符合要求。我们在主查询中使用了这个子查询的结果来更新工资。
接着,我们使用另一个 UPDATE 语句来将那些符合要求且职称为助教的教师晋升为讲师。具体地,我们使用了两个子查询来找到那些符合要求的教师。第一个子查询与上面相同,用于找到那些至少担任了两门课程,并且优秀率达到了 33% 的教师。第二个子查询则用于找到那些职称为助教的教师。我们在主查询中使用了这两个子查询的交集来更新职称。
最后,我们使用 BEGIN TRANSACTION 和 COMMIT TRANSACTION 语句将整个操作封装在一个事务中,以确保数据的一致性和完整性。
SQL server用事务编写学校嘉奖优秀教师:增加津贴500元,如次教师是助教,则可以破格晋升为讲师.获得优秀教师的条件是:至少担任2 门课程,每门课程及格率100%,优秀率33%
可以通过以下 SQL 代码来实现该业务逻辑:
```
BEGIN TRAN
DECLARE @teacher_id INT = 123 -- 填入教师 ID
DECLARE @course_num INT = (SELECT COUNT(*) FROM courses WHERE teacher_id = @teacher_id) -- 统计该教师的课程数目
DECLARE @pass_num INT = (SELECT COUNT(*) FROM course_results WHERE teacher_id = @teacher_id AND score >= 60) -- 统计该教师的及格人数
DECLARE @excellent_num INT = (SELECT COUNT(*) FROM course_results WHERE teacher_id = @teacher_id AND score >= 90) -- 统计该教师的优秀人数
IF @course_num >= 2 AND @pass_num = @course_num AND @excellent_num >= CEILING(@course_num * 0.33)
BEGIN
UPDATE teachers SET allowance = allowance + 500 WHERE teacher_id = @teacher_id -- 增加津贴 500 元
IF EXISTS (SELECT * FROM assistants WHERE teacher_id = @teacher_id)
BEGIN
UPDATE assistants SET position = '讲师' WHERE teacher_id = @teacher_id -- 破格晋升为讲师
END
PRINT '该教师获得优秀教师称号,并获得津贴 500 元及破格晋升为讲师。'
END
ELSE
BEGIN
PRINT '该教师不满足获得优秀教师称号的条件。'
END
COMMIT TRAN
```
其中,`teachers` 表存储教师信息,包括教师 ID 和津贴等;`courses` 表存储课程信息,包括课程 ID 和教师 ID 等;`course_results` 表存储课程成绩信息,包括学生 ID、课程 ID、教师 ID 和分数等;`assistants` 表存储助教信息,包括教师 ID 和职位等。
该代码使用了事务来确保原子性和一致性,防止多个教师同时竞争嘉奖导致数据错误。首先统计该教师的课程数目、及格人数和优秀人数,然后根据条件判断是否满足获得优秀教师称号的条件。如果满足,增加津贴 500 元,并判断是否为助教以破格晋升为讲师;否则不做任何操作。最后使用 `COMMIT TRAN` 提交事务,或者使用 `ROLLBACK TRAN` 回滚事务。
阅读全文