【问题标题】:Inner Join Statement in SQLite with Conditions [closed]SQLite中带有条件的内部连接语句[关闭]
【发布时间】:2019-02-13 19:42:04
【问题描述】:

如果我们有以下两个表,“teachers”和“classes”,我们如何使用 INNER JOIN 语句生成最终表,其中 (i) “class_count” 必须至少为 2 才能包含教师在决赛桌中,并且 (ii) 一个班级的“评分”必须至少为 50 才能计入“平均评分”计算?

“教师”表

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;

【问题讨论】:

  • 你能详细说明“没有工作”吗?你有错误吗?结果错误?
  • 得到错误的结果
  • 愿意分享吗?
  • 嗨。当您研究 re SUM 时,您遇到了 GROUP BY。探索如何?你可以用它做什么部分?为什么不提?请阅读并根据点击谷歌搜索“stackexchange 作业”采取行动。另外:这是一个常见问题解答。请始终在谷歌上搜索您的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,带和不带您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用一个变体搜索您的标题和关键字作为您的标签。请参阅向下投票箭头鼠标悬停文本。还有minimal reproducible example.

标签: sql join sqlite inner-join


【解决方案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

【讨论】:

    【解决方案2】:

    您似乎只错过了一个GROUP BY 子句。

    在类的 ID 上加入表。在WHERE 子句过滤器中筛选所需的class_countrating。然后GROUP BY老师的ID和姓名,用you sum by count表达式计算平均评分。

    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 表中,因为这需要在教师教授的课程发生变化时更新该值。如果这样的更新被遗忘或失败,那么值就是错误的也是危险的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-04
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      相关资源
      最近更新 更多