我试图在一年中使员工的年平均数。
表'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个“电子编码”?
答案 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)