Выбор городов, в которых 10 или более студентов и преподавателей объединены в SQL - PullRequest
0 голосов
/ 17 ноября 2018

Мне нужно указать город, штат, количество студентов-резидентов, количество жителей-инструкторов и общее количество студентов / преподавателей в этом городе.Информация содержится в 3 таблицах: ZIPCODE, STUDENT и INSTRUCTOR.

  • Таблица ZIPCODE содержит столбцы ZIP, CITY и STATE.
  • Таблица STUDENT имеет STUDENT_ID и ZIP.
  • В таблице INSTRUCTOR есть INSTRUCTOR_ID и ZIP.

Я пробовал пару внутренних объединений и пересечений, но продолжаю получать самые разные ошибки.Я все еще очень плохо разбираюсь в SQL и не уверен, как на самом деле это сделать, любая помощь или совет будут с благодарностью.

1 Ответ

0 голосов
/ 17 ноября 2018

Вы, вероятно, хотите сочетание союза и присоединиться для этого. Я сомневаюсь, что вы хотите пересечь. Множество способов сделать это, вот один

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: многие суммы были бы искажены. Поскольку несколько почтовых индексов могут относиться к одному городу, существует другой раунд группировки и суммирования для объединения всех почтовых индексов из одного города

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...