SQLite中带条件的内部联接语句
如果我们有以下两个表,“教师”和“班级”,我们如何使用内部联接语句生成最终表,其中(i)“班级人数”必须至少为2,才能将教师包括在最终表中;(ii)班级的“评分”必须至少为50,才能将班级计入“平均评分”计算中 “教师”表 “类别”表 我们希望最终的表格看起来像:SQLite中带条件的内部联接语句,sql,join,sqlite,inner-join,Sql,Join,Sqlite,Inner Join,如果我们有以下两个表,“教师”和“班级”,我们如何使用内部联接语句生成最终表,其中(i)“班级人数”必须至少为2,才能将教师包括在最终表中;(ii)班级的“评分”必须至少为50,才能将班级计入“平均评分”计算中 “教师”表 “类别”表 我们希望最终的表格看起来像: teacher_id teacher_name average_rating 1234 Smith 65 2345 Jones
teacher_id teacher_name average_rating
1234 Smith 65
2345 Jones 70
5678 Taylor 60
我在sqlite中尝试了以下代码,但没有给出正确的结果(如上面最后一个表所示)
似乎您只遗漏了一个
GROUP BY
子句
连接类ID上的表。在WHERE
子句中,为所需的class\u计数
和评级
筛选。然后根据
教师的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的链接表中
此外,还可以查询教师授课的班级数量。它不应该实际存储在
教师
表中,因为这需要在教师授课的课程发生更改时更新该值。如果这样的更新被遗忘或失败,那么值就是错误的,这也是危险的。好的,下面是正确的答案。你差一点就成功了,只是错过了两件事:
首先,没有GROUP BY(您必须将此语句始终包含在agregate函数中,然后是字段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
--结果:
你能详细说明一下“不起作用”吗?你是否有错误?错误的结果?错误的结果?请分享它?嗨。当你研究re SUM时,你遇到了一个小组。探索过程如何?你可以使用它做什么?为什么不提它?请阅读并点击谷歌的“stackexchange家庭作业”进行操作。另外:这是一个常见问题。请始终搜索许多清晰、简洁的内容&您的问题/问题/目标的特定版本/措辞,有或没有您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,则发布,使用一种变体搜索您的标题和标签的关键字。请参见鼠标悬停文本上的向下投票箭头。还有。
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;
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;
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