我得到了一个数据库,它有以下3个表:
instructor(ID, name, dept_name, salary)
teaches(ID, course_id, sec_id, semester, year)
takes(ID, course_id, sec_id, semester, year, grade)
该查询的目标是统计每个教师教授的学生总数,但每个教师只能计算每个学生一次。我现在的问题是,教零学生的老师没有被包括在内。
我想要的输出示例如下所示:
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
但问题是我得到的结果是:
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,但结果总是相同的。我是不是漏掉了什么?
作为参考,我在这个问题上做了两种不同的尝试:
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;
发布于 2019-03-23 01:57:11
请注意原文中的@GordonLinoff评论。我假设Teaches.ID = Instructor.ID,就像第二次尝试一样。如果我假设错了,那么就没有关系了,因此你不能得到你想要的结果。
你的第二次尝试已经很接近了。group by语句中的错误
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
我使用一些样本数据对此进行了测试,它工作得非常好。
样本数据
这是原始数据。请注意,一个教授是如何让一个学生在多个班级的。另请注意,出于测试目的,我在同一个类中列出了一个学生两次。
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
以下是结果
dept_name ID NAME Total
Accounting 14365 Lembr 1
Accounting 77645 Jarold 3
Accounting 79081 Ullman 1
我希望这对你有帮助!祝好运!
https://stackoverflow.com/questions/55303699
复制相似问题