我正在使用以下查询
从上面的4个表中检索结果SELECT
(SELECT SUM(CASE when c.Training_Id=1 then 1 else 0 end)
FROM courses c
INNER JOIN enrolled_students es
ON c.Course_Id = es.Course_Id
) STEM,
(SELECT SUM(CASE when c.Training_Id=2 then 1 else 0 end)
FROM courses c
INNER JOIN enrolled_students es ON c.Course_Id = es.Course_Id
) MA,
c.* FROM campus c;
这个问题的问题是,两(2)名学生在STEM,一(1)名学生在MA对抗Campus_Id 3,但是它重复记录所有校园。我想如果校园没有学生,那么应该有'0'零。
答案 0 :(得分:1)
您需要按Campus_Id
过滤子选择。但首先必须使用不同的表别名。将您的上一行更改为ca.* FROM campus ca
。然后,您可以在子选择(WHERE c.Campus_Id = ca.Campus_Id
)中使用where子句。
SELECT
(SELECT SUM(CASE when c.Training_Id=1 then 1 else 0 end)
FROM courses c
INNER JOIN enrolled_students es
ON c.Course_Id = es.Course_Id
WHERE c.Campus_Id = ca.Campus_Id -- line added
) STEM,
(SELECT SUM(CASE when c.Training_Id=2 then 1 else 0 end)
FROM courses c
INNER JOIN enrolled_students es ON c.Course_Id = es.Course_Id
WHERE c.Campus_Id = ca.Campus_Id -- line added
) MA,
ca.* FROM campus ca; -- line changed
这可以解决您的问题。
要提高效果,您还可以按Training_Id
过滤子选择。在第一个子选择中,您只需要Training_Id=1
行。因此,您可以将where子句更改为:
WHERE c.Campus_Id = ca.Campus_Id
AND c.Training_Id = 1
这样做也可以使用COUNT
代替SUM
。所以你的子选择看起来像:
SELECT COUNT(1)
FROM courses c
INNER JOIN enrolled_students es ON c.Course_Id = es.Course_Id
WHERE c.Campus_Id = ca.Campus_Id AND c.Training_Id = 1
为防止代码重复(您的子选择几乎相等),您可以按Campus_Id
加入所有需要的表和分组:
select
COUNT(co.Training_Id=1 OR NULL) STEM,
COUNT(co.Training_Id=2 OR NULL) MA,
ca.Campus_Id
from campus ca
left join courses co on co.Campus_Id = ca.Campus_Id
left join enrolled_students es on es.Course_Id = co.Course_Id
where co.Training_Id in (1, 2)
group by ca.Campus_Id