Вы, вероятно, хотите сочетание союза и присоединиться для этого. Я сомневаюсь, что вы хотите пересечь. Множество способов сделать это, вот один
SELECT
Z.city,
Z.state,
SUM(case when d.typ = 's' then 1 ELSE 0 END) as count_students,
SUM(case when d.typ = 'i' then 1 ELSE 0 END) as count_instructors,
Count(*) as count_all
FROM
(SELECT * FROM
(SELECT 's' as typ, zip FROM student)
UNION ALL
(SELECT 'I ' as typ, zip FROM Instructor)
) d
INNER JOIN
zipcode z
ON d.zip on z.zip
GROUP BY
z.city, z.state
Я извлекаю все записи из каждой таблицы ученика и преподавателя и объединяю их в один большой список, делаю столбец для отслеживания типа, сумма подсчитывает, когда тип s, случай, когда возвращается a 1. Сумма будет суммировать 1 с как счет. Таким образом, в итоге вы получаете комбинацию город / штат / тип для каждой строки, а при группировке по городу и штату и суммировании по типу получается счет
Вот еще один способ сделать это:
SELECT
Z.city,
Z.state,
SUM(s.ct) as count_students,
SUM(i.ct) as count_instructors,
SUM(s.ct) + SUM(I.ct) as count_all
FROM
zipcode z
LEFT OUTER JOIN
(SELECT zip, count(*) ct FROM student GROUP BY zip) s
ON s.zip = z.zip
LEFT OUTER JOIN
(SELECT zip, count(*) as ct FROM Instructor GROUP BY zip) i
ON i.zip = z.zip
GROUP BY z.city, z.state
Мы группируем и подсчитываем студентов и преподавателей в их собственных подзапросах, производя только один счет за почтовый индекс, и присоединяем их (левое соединение) ко всем почтовым индексам. Мы группируем подзапрос, чтобы убедиться, что между zipcode и s / i существует только соотношение 1: 1. Если бы это было 1: многие суммы были бы искажены. Поскольку несколько почтовых индексов могут относиться к одному городу, существует другой раунд группировки и суммирования для объединения всех почтовых индексов из одного города