SQLite中带条件的内部联接语句

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

如果我们有以下两个表,“教师”和“班级”,我们如何使用内部联接语句生成最终表,其中(i)“班级人数”必须至少为2,才能将教师包括在最终表中;(ii)班级的“评分”必须至少为50,才能将班级计入“平均评分”计算中

“教师”表

“类别”表

我们希望最终的表格看起来像:

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