首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何计算每个教师教的学生数量,而不包括重复的学生数量?

如何计算每个教师教的学生数量,而不包括重复的学生数量?
EN

Stack Overflow用户
提问于 2019-03-23 00:10:06
回答 1查看 44关注 0票数 0

我得到了一个数据库,它有以下3个表:

代码语言:javascript
运行
复制
instructor(ID, name, dept_name, salary)
teaches(ID, course_id, sec_id, semester, year)
takes(ID, course_id, sec_id, semester, year, grade)

该查询的目标是统计每个教师教授的学生总数,但每个教师只能计算每个学生一次。我现在的问题是,教零学生的老师没有被包括在内。

我想要的输出示例如下所示:

代码语言:javascript
运行
复制
dept_name   id      ins_name  students_taught
Accounting  79081   Ullman    1218
Accounting  14365   Lembr     529
Accounting  77645   Jarold    0
Astronomy   43779   Romero    981
Athletics   41930   Tung      749
Athletics   63287   Jaekel    524
Athletics   15347   Bawa      266
Athletics   76458   Smith     0
Biology     81991   Valtchev  550
Biology     80759   Queiroz   312
Biology     98738   Quincy    0
Biology     22213   Lee       0
Comp. Sci.  34175   Bondi     817
Comp. Sci.  3335    Bourrier  566

但问题是我得到的结果是:

代码语言:javascript
运行
复制
dept_name   id      name     students_taught
Accounting  79081   Ullman   1218
Accounting  14365   Lembr    529
Astronomy   43779   Romero   981
Athletics   41930   Tung     749
Athletics   63287   Jaekel   524
Athletics   15347   Bawa     266
Biology     81991   Valtchev 550
Biology     80759   Queiroz  312
Comp. Sci.  34175   Bondi    817
Comp. Sci.  3335    Bourrier 566

我尝试了许多不同的方法,比如使用where子句或使用left joins,但结果总是相同的。我是不是漏掉了什么?

作为参考,我在这个问题上做了两种不同的尝试:

代码语言:javascript
运行
复制
Attempt 1:
SELECT instructor.dept_name AS dept_name,
       instructor.id AS inID,
       instructor.name AS name,
       count(DISTINCT takes.id) AS total
FROM instructor
LEFT OUTER JOIN teaches ON instructor.id = teaches.id
JOIN
  (SELECT dept_name,
          id,
          name
   FROM instructor) AS ins,
     takes
WHERE takes.course_id = teaches.course_id
  AND takes.sec_id = teaches.sec_id
GROUP BY inID
ORDER BY dept_name,
         total DESC;

Attempt 2:
SELECT instructor.dept_name AS dept_name,
       instructor.id,
       instructor.name,
       count(DISTINCT takes.id) AS total
FROM instructor
INNER JOIN teaches ON teaches.id = instructor.id
INNER JOIN takes ON takes.course_id = teaches.course_id
AND takes.sec_id = teaches.sec_id
GROUP BY ins.id
ORDER BY dept_name,
         total DESC;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-23 01:57:11

请注意原文中的@GordonLinoff评论。我假设Teaches.ID = Instructor.ID,就像第二次尝试一样。如果我假设错了,那么就没有关系了,因此你不能得到你想要的结果。

你的第二次尝试已经很接近了。group by语句中的错误

代码语言:javascript
运行
复制
SELECT a.dept_name
    ,a.ID
    ,a.NAME
    ,count(DISTINCT c.ID) AS Total
 FROM instructor a
 LEFT JOIN teaches b ON b.ID = a.ID
 LEFT JOIN takes c ON c.course_id = b.course_id
    AND c.sec_id = b.sec_id
GROUP BY a.dept_name
    ,a.ID
    ,a.NAME

我使用一些样本数据对此进行了测试,它工作得非常好。

样本数据

这是原始数据。请注意,一个教授是如何让一个学生在多个班级的。另请注意,出于测试目的,我在同一个类中列出了一个学生两次。

代码语言:javascript
运行
复制
ID  name    dept_name   salary  ID  course_id   sec_id  semester    year    ID  course_id   sec_id  semester    year    grade
79081   Ullman  Accounting  100 79081   1   2   1   2019    13  1   2   1   2019    12
14365   Lembr   Accounting  100 14365   2   2   1   2019    14  2   2   1   2019    12
14365   Lembr   Accounting  100 14365   2   2   1   2019    14  2   2   1   2019    12
77645   Jarold  Accounting  100 77645   3   2   1   2019    10  3   2   1   2019    12
77645   Jarold  Accounting  100 77645   3   2   1   2019    11  3   2   1   2019    12
77645   Jarold  Accounting  100 77645   3   2   1   2019    12  3   2   1   2019    12
77645   Jarold  Accounting  100 77645   4   2   1   2019    10  4   2   1   2019    12

以下是结果

代码语言:javascript
运行
复制
dept_name   ID  NAME    Total
Accounting  14365   Lembr   1
Accounting  77645   Jarold  3
Accounting  79081   Ullman  1

我希望这对你有帮助!祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55303699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档