如果我们有以下两个表“ teachers”和“ classes”,我们如何使用INNER JOIN语句生成最终表,其中(i)“ class_count”必须至少为2才能包含一名教师在最终表中;(ii)一个类别的“评分”必须至少为50,才能将一个类别计入“ average_rating”计算?
“老师”表
teachers
class_id teacher_id teacher_name class_count
1111 1234 Smith 2
4444 2345 Jones 3
2222 1234 Smith 2
5555 2345 Jones 3
3333 5678 Taylor 2
6666 2345 Jones 3
7777 5678 Taylor 2
8888 6789 Thomas 1
“类”表
classes
id class_name rating
1111 Math 60
2222 Biology 70
3333 Psychology 50
4444 Physics 80
5555 Chemistry 30
6666 Economics 60
7777 Computing 70
8888 Statistics 90
我们希望决赛桌看起来像这样:
teacher_id teacher_name average_rating
1234 Smith 65
2345 Jones 70
5678 Taylor 60
我在sqlite中尝试了以下代码,但未给出正确的结果(如上表所示)。
SELECT t.teacher_id, t.teacher_name, SUM(c.rating) / t.class_count
FROM teachers t
INNER JOIN classes c on c.id = t.class_id
WHERE c.rating >= 50 AND t.class_count >= 2;
答案 0 :(得分:1)
似乎您只错过了GROUP BY
子句。
将表加入类的ID。在WHERE
子句中,过滤所需的class_count
和rating
。然后GROUP BY
的ID和老师的姓名,然后使用您的“按计数求和”表达式来计算平均评分。
SELECT t.teacher_id,
t.teacher_name,
sum(t.rating) / t.class_count average_rating
FROM teachers t
INNER JOIN classes c
ON c.id = t.class_id
WHERE t.class_count >= 2
AND t.rating >= 50
GROUP BY t.teacher_id,
t.teacher_name;
但是您的架构不是最好的。
在teachers
表中,每位老师只应在一行中教授一堂课,而不是重复他们所教的每一堂课。
哪个老师教哪个班级应该存储在包含班级ID和老师ID的链接表中。
还可以查询老师教的班数。不应将其物理存储在teachers
表中,因为每当老师教的课有变化时,都需要更新该值。如果这样的更新被遗忘或失败,也很危险,那就是该值是错误的。
答案 1 :(得分:1)
好的,这是正确的答案。好吧,您几乎明白了-只是错过了两件事: 首先没有GROUP BY(您必须始终在聚合函数中包含此语句,然后才是class_count字段-但您必须根据评分总和除以类别数(COUNT(*))来计算平均评分
因此,如果您在问题末尾输入的结果是正确的,那么下面的代码也是正确的。
SELECT
t.teacher_id,
t.teacher_name,
SUM(c.rating) / COUNT(*) as average_rating
FROM teachers t
INNER JOIN classes c on
c.id = t.class_id
WHERE
t.class_count >= 2 and
c.rating >= 50
GROUP BY
t.teacher_id,
t.teacher_name
ORDER BY
t.teacher_id
-结果:
teacher_id teacher_name average_rating
1234 Smith 65.000000
2345 Jones 70.000000
5678 Taylor 60.000000