首页 > 解决方案 > T-SQL - 员工年平均

问题描述

我试图在一年内计算出员工的年平均水平。

表 'a' 是这样构造的:

CREATE TABLE [dbo]. [A] 
(
    [id] [INT] NOT NULL,
    [start] [DATETIME] NOT NULL,
    [end] [DATETIME] NOT NULL,
    [employee_code] [INT] NOT NULL
)

1 - 01/01/2016 - 03/31/2019 - 56
2 - 01/01/1995 - 06/06/2017 - 13
-
-

如果我只是计算 2017 年 1 月 1 日至 2017 年 12 月 31 日之间的 [employee_code],则计算不正确,因为它没有计算月平均值。

你能帮助我吗?(正确的计算是有 12 条记录表示月数,最后除以 12)

我不能用 T-SQL 命令做所有事情。

你能帮助我吗?


你好,谢谢,是的,我就是这样。只有一件事,在查询结果中有以下记录:

1995 1 0 NULL
1995 2 0 NULL
1995 3 0 NULL
1995 4 0 NULL
1995 5 6 NULL
1995 6 6 NULL
1995 7 10 NULL
1995 8 10 NULL
1995 9 10 NULL
1995 10 12 NULL
1995 11 12 NULL
1995 12 12 NULL
NULL 78 1995 6.500000

我开始的初始数据是:

03/04/1995 10/20/2005 4
03/04/1995 19/06/2016 2
03/04/1995 12/15/2016 2847
03/04/1995            1
03/04/1995            5
03/04/1995            3
02/06/1995 03/07/2009 9
02/06/1995            8
02/06/1995            7
02/06/1995            6
09/15/1995 16/05/2017 34
09/15/1995            33

为什么是 5 月而不是 4 月的 6 个“ecode”?

标签: sqlsql-servertsql

解决方案


编辑

WITH mnths as (
  select CAST('01/15/1995' as date) as mnth UNION ALL
  select DATEADD(month,1,mnth) FROM mnths WHERE mnth<'12/15/2019'
), edata AS (
  SELECT mnth,
  (SELECT count(ecode) FROM @A A 
   WHERE mnth between estart AND COALESCE(eend,getdate())) ecnt
  FROM mnths
)
SELECT year(mnth) yr, month(mnth) mn, AVG(ecnt+0.) emplcount
FROM edata 
group by year(mnth), month(mnth) 
WITH ROLLUP
OPTION (MAXRECURSION 1000)

此版本考虑了您的最新编辑并用于ROLLUP缩短查询代码,请参见此处的演示:

https://rextester.com/IQAB32422

不幸的是,考虑到您使用的是美国语法,您的日期并不完全正确month/day/year。出于这个原因,我得到的数字略有不同......

最初在每个月的第一天进行比较,即员工是否在特定月份受雇。我现在把它改到每个月的 15 号。但即便如此,这也只是一个“任意”日期,不会计算从每月 1 日到 14 日在场的员工。


推荐阅读