Необходимо отфильтровать подзаголовки на Campus_Id
. Но сначала вы должны использовать отдельные псевдонимы таблицы. Измените свою последнюю строку на ca.* FROM campus ca
. Затем вы можете использовать предложение where в своих подзапросах (WHERE c.Campus_Id = ca.Campus_Id
).
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 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
Правильные создания и вставки заявлений и Соответствующий желаемый результат спасибо. Предпочтительно, SQLfiddle тоже. – Strawberry