【问题标题】:Average Group size per month Over previous ten years过去十年中每月平均组规模
【发布时间】:2016-11-11 21:36:11
【问题描述】:

我需要找出过去十年每月与我们开展业务的所有群体(雇主)的平均规模(平均员工人数)。

所以我可以毫无问题地获得每个月的平均组大小。对于当前月份,我可以使用以下内容:

Select count(*)
from Employees EE
join Employers ER on EE.employerid = ER.employerid
group by ER.EmployerName 

这将为我提供每个组中有多少员工的列表。然后我可以将该列复制并粘贴到 excel 中,以获得当月的平均值。

对于上个月,我想排除该月之后添加的所有员工。我对此也有疑问:

Select count(*)
from Employees EE
join Employers ER on EE.employerid = ER.employerid 
where EE.dateadded <= DATEADD(month, -1,GETDATE())
group by ER.EmployerName

这将排除本月添加的所有员工。我可以在十年前一直这样做,但我知道有更好的方法来做到这一点。我运行这个查询 120 次没有问题,将结果复制并粘贴到 excel 中以计算平均值。但是,我宁愿学习一种更有效的方法来做到这一点。

另一个问题,我无法执行以下操作,任何人都知道解决方法:

Select avg(count(*))

提前谢谢大家!!

编辑:可以像这样找到已被解雇的员工。 NULL 是当前受雇的员工。

Select count(*)
from Employees EE
join Employers ER on EE.employerid = ER.employerid
join Gen_Info gne on gne.id = EE.newuserid
where EE.dateadded <= DATEADD(month, -1,GETDATE())
and (gne.TerminationDate is NULL OR gen.TerminationDate < DATEADD(day, -14,GETDATE())
group by ER.EmployerName

【问题讨论】:

  • 我真的希望您不必在 mySQL、oracle 和 SQL Server 中执行此操作……因为每个的日期逻辑不同。此外,一些具有预期结果的样本数据将有助于更好地构建问题。
  • 语法查找 mssql
  • 离开雇主的员工怎么办?您向我们展示了如何确定它们何时被添加,而不是如何识别它们何时被移除。如果他们离开并且不再在员工表中,那么您将永远无法获得准确的平均值,因为您永远不会计算曾经受雇的员工
  • 我和马特在这里。根据目前提供的数据,您根本无法确定一次有多少员工为雇主工作。
  • 编辑了我原来的帖子。谢谢!

标签: sql sql-server average


【解决方案1】:

您是否正在查询按年份和月份添加计数的查询?如果是这样,这看起来很简单。

这是使用 mySQL 日期函数年和月。

Select AVG(cnt) FROM (
  Select count(*) cnt, Year(dateAdded), Month(dateAdded)
  from System_Users su
  join system_Employers se on se.employerid = su.employerid 
  group by Year(dateAdded), Month(dateAdded)) B

内部查询计数并按年和月分解计数然后我们将其包装在查询中以显示平均值。

--第 2 次尝试,但我的 Brain FriDay 已经出局了。

这使用公用表表达式 (CTE) 生成一组数据,用于按员工的年、月计算,然后按月计算平均值。 如果这不是您所追求的,带有预期结果的样本数据将有助于更好地构建问题,我可以对您需要/想要什么做出假设。

With CTE AS (
Select Year(dateAdded) YR , Month(DateAdded) MO, count(*) over (partition by Year(dateAdded), Month(dateAdded) order by DateAdded Asc) as RunningTotal
from System_Users su
join system_Employers se on se.employerid = su.employerid 
Order by YR ASC, MO ASC)
Select avg(RunningTotal), mo from cte;

【讨论】:

  • 感谢您的回复!我不想按添加员工的时间来计算。相反,我需要找到自 2006 年以来每月的平均小组规模。
  • 所以这听起来像您需要按月/年计算的运行“平均值”,这可能由分析...
  • 我不认为“运行平均值”正是我想要的。在计算运行平均值并添加新值时,将删除最旧的值。例如,可以通过取 1 月至 6 月的销售额平均值、2 月至 7 月的销售额平均值、3 月至 8 月的销售额平均值等来计算 6 个月销售额的移动平均值。可以通过取 1 月至 6 月的平均销售额,然后是 2 月至 7 月的平均值来计算 6 个月的销售额。我不想删除任何数据,就像在我的示例中删除 Jan 的方式一样。
  • 非常感谢您的帮助!我非常感谢。您的第二次尝试与我正在寻找的非常接近。但是,需要从查询中删除添加日期,我使用添加日期列来避免计算超过某个日期的员工。我一直在玩它,但我不知道如何让月/年回到 2006 年。我需要这样的结果例如,我会使用 date added 列来避免计算 10 月之后添加的员工31 来获得我 10 月份的平均小组规模。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 2014-10-16
相关资源
最近更新 更多