Помогите решить задачку по sql

В реляционной базе данных существуют таблицы:

Cities - список городов

id - первичный ключ name - название population - численность населения founded - год основания country_id - id страны

Countries - список стран

id - первичный ключ name - название population - численность населения gdp - валовый продукт в долларах

Companies - компании

id - первичный ключ name - название city_id - город в котором находится штаб-квартира revenue - годовая выручка в долларах labors - численность сотрудников

Составьте запрос, который:

Для всех стран в базе данных посчитать количество компаний со штаб квартирами в этой стране численность сотрудников в которых больше 1000 человек В результате должны быть только количество компаний и названия стран с населением более 1 миллиона человек и валовым продуктом более 10 миллиардов долларов, у которых суммарная выручка выбранных компаний составляет более 1 миллиарда долларов

Мой вариант:

select *, count(labors),count(revenue),FROM Companies
group by name
HAVING count(labors) >=1000 AND count(revenue) >= 1000000000

( это я пытался выстроить компании с численность сотрудников > 1000 и доходом более 1ккк) Далее я так полагаю нужно получившийся список сравнить со списком (Countries ) и составить новый список и новый список сравнить со с писком (Cities ) и этот список будет ответом.

П.С. Хотелось бы получить не просто ответ но и логику выполнения такого задания.


Ответы (2 шт):

Автор решения: CrazyElf

Это учебное задание и вы должны решить его сами. Но вы даже не попытались.

Вот прямо сходу:

  • select * - вам указан конкретный список полей для вывода, никаких звёздочек, конкретные поля в конкретном порядке
  • Для всех стран - а у вас таблица со странами даже не участвует в запросе, хотя по формулировке очевидно, что всё будет завязано на список стран
  • ,FROM - это что? Этот запрос даже не скомпилируется

Вам нужно более тщательно прочитать задание и попытаться хотя бы в первом приближении без изысков написать запрос "в лоб". А дальше уже разбираться - что вы не знаете как сделать, пробовать разные варианты, и если не получится что-то - задавать более конкретный вопрос.

То есть нужно написать SELECT конкретных полей (и аггрегаций) из конкретного перечня таблиц, связать их как-то через условия, эти таблицы, ну и дальше над этим всем работать.

→ Ссылка
Автор решения: Max Raskolnikov

Один из вариантов реализации:

    SELECT cou.name AS `Country`, COUNT(com.id)
      FROM Companies com
      LEFT JOIN Cities cit
      ON cit.id = com.city_id
      LEFT JOIN Countries cou
      ON cit.country_id = cou.id
WHERE  com.labors > 1000
AND city_id IN (SELECT cit2.id
                  FROM Cities cit2                                                 
                  LEFT JOIN Countries cou2
                  ON cit2.country_id = cou2.id                                            
                  WHERE cou2.population > 1000000 AND cou2.gdp > 10000000000)
GROUP BY cou.id               
HAVING SUM(com.revenue) > 1000000000

Источник: https://skalolaskovy.ru/sql/572-yandeex-sql-task

→ Ссылка