T-SQL-员工年度平均

时间:2019-05-31 16:20:57

标签: sql sql-server tsql

我试图在一年中使员工的年平均数。

表'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日之间的[员工编号],则该计算是不正确的,因为它不是每月平均值。

你能帮我吗? (正确的计算方法是有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个“电子编码”?

2 个答案:

答案 0 :(得分:0)

已编辑

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号的员工人数。

答案 1 :(得分:0)

根据您的评论和以前的答案,您是否正在寻找类似的东西?

DECLARE @A table (
eid int NOT NULL,
estart datetime,
eend datetime,
ecode int)
insert into @A VALUES (1,'02/01/2016','03/31/2019',56),
(2,'05/01/1995','01/06/2017',13);

WITH mnths as (
  select CAST('01/01/1995' as date) as mnth UNION ALL
  select DATEADD(month,1,mnth) FROM mnths WHERE mnth<'12/01/2019'
), edata AS (
  SELECT mnth,
  (SELECT count(ecode) FROM @A A WHERE mnth between estart AND eend) ecnt
  FROM mnths
)
select * FROM(
    SELECT year(mnth) yr, month(mnth) mn, ecnt, null eavg 
    FROM edata
    union all
    SELECT year(mnth) yr, null mn, SUM(ecnt) as ecnt, SUM(ecnt) / 12.00 eavg 
    FROM edata
    GROUP BY year(mnth)) A
order by 
    A.yr, 
    CASE WHEN a.mn IS NULL THEN 13 else a.mn END
OPTION (MAXRECURSION 1000)