Функция AVG () отображает среднее значение всех сотрудников вместо среднего числа сотрудников в каждом городе на магазин - PullRequest
0 голосов
/ 10 апреля 2019

Я хочу отобразить среднесписочную численность работников в каждом городе. Город может иметь

Это мой data_base:

enter image description here

Для пояснения предполагается, что работодатели работают неполный рабочий день, поэтому может возникнуть ситуация, когда они в настоящее время не работают ради выполнения запросов 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

В основном, что я получаю, так это всех сотрудников, поделенных на количество городов. Я хочу, чтобы в среднем в каждом городе работали сотрудники, например, в town1 у меня 2 магазина. В Shop1 2 сотрудника, в то время как в shop2 4 сотрудника. Среднее значение для города1 должно быть 3.

1 Ответ

0 голосов
/ 10 апреля 2019

Похоже, ваша проблема в том, что вы не группируете данные по магазинам в подзапросе подсчета сотрудников, поэтому этот запрос возвращает общее количество сотрудников в каждом городе. Кроме того, вам не нужно группировать по городам в этом подзапросе. Без полной структуры таблицы и примеров данных трудно быть уверенным, но я думаю, что это то, что вы действительно хотите:

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
...