AVG()函数显示的是所有员工的平均人数,而不是每个商店每个城镇的员工平均人数

时间:2019-04-10 12:22:18

标签: mysql count average

我想显示每个城镇的平均雇员数。城镇可以拥有

这是我的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 :(得分:0)

您的问题似乎是您没有在员工数子查询中按商店对数据进行分组,因此该查询返回的是每个城镇的员工总数。另外,您无需在该子查询中按城镇分组。没有完整的表结构和示例数据,很难确定,但是我认为这是您真正想要的:

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