Функция AVG() отображает среднее число всех сотрудников вместо среднего числа сотрудников в каждом городе на магазин

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

Это мой data_base:

Функция AVG() отображает среднее число всех сотрудников вместо среднего числа сотрудников в каждом городе на магазин

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

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Спасибо большое. Это именно то решение моей проблемы. Теперь он правильно отображает значение AVG для каждого города. Например, значение 3 AVG для города1.

T4under4 10.04.2019 17:13

@ T4under4 Рад, что смог помочь.

Nick 11.04.2019 00:30

Другие вопросы по теме