Я хочу отобразить среднее количество сотрудников в каждом городе. Город может иметь
Это мой data_base
:
Чтобы уточнить, предполагается, что работодатели работают неполный рабочий день, поэтому может возникнуть ситуация, когда они в настоящее время не работают ради выполнения запросов OUTER JOIN. Они также могут быть назначены более чем 1 магазину.
Я нашел способ сделать это, используя подзапрос для функции AVG. В подзапросе я буду использовать COUNT для подсчета количества сотрудников для каждого города и каждого магазина, а основной запрос получит AVG для группировки этих чисел по городам. Однако, хотя логически я чувствую, что запрос должен работать, он отображает неправильные данные. Ниже приведен запрос, который я создал.
SELECT s.Town, AVG(a.cnt) AS `Number of employees` FROM
(SELECT COUNT(k.EmpId) AS cnt FROM `Shops and Employees` k
INNER JOIN Shops s ON s.ShopId = k.ShopId
GROUP BY s.Town) AS a, shops s
GROUP BY s.Town
Я ожидал увидеть что-то вроде этого:
Town name | AVG of employees per town
-------------------------------------
town1 | 3
town2 | 5
town3 | 1
town4 | 4
Instead I get this:
Town name | AVG of employees per town
-------------------------------------
town1 | 2
town2 | 2
town3 | 2
town4 | 2
В основном то, что я получаю, это сумма всех сотрудников, деленная на количество городов. Я хочу среднее количество сотрудников для каждого города, например. в городе1 у меня 2 магазина. В магазине 1 работает 2 сотрудника, а в магазине 2 — 4 человека. В среднем для города 1 должно быть 3.
Похоже, ваша проблема заключается в том, что вы не группируете данные по магазинам в подзапросе подсчета сотрудников, поэтому этот запрос возвращает общее количество сотрудников в городе. Кроме того, вам не нужно группировать по городам в этом подзапросе. Без полной структуры таблицы и примеров данных трудно быть уверенным, но я думаю, что это то, что вам действительно нужно:
SELECT s.Name as `Town Name`, AVG(se.cnt) AS `AVG employees per shop`
FROM Shops s
JOIN (SELECT ShopId, COUNT(*) AS cnt
FROM `Shops and Employees`
GROUP BY ShopId) se ON se.ShopId = s.ShopId
GROUP BY s.Name
@ T4under4 Рад, что смог помочь.
Спасибо большое. Это именно то решение моей проблемы. Теперь он правильно отображает значение AVG для каждого города. Например, значение 3 AVG для города1.