sql - 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”?
解决方案
编辑:
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 日在场的员工。
推荐阅读
- java - 使用 Gson 将对象转换为 JSON 字符串时的频繁 GC
- javascript - 如何链接到handleSubmit formik中的下一页url?
- reactjs - 如何将 thunk 动作转换为 saga 动作
- shell - 使用 jq 合并两个包含公共数组的 Apache Avro 模式
- python-3.x - 您如何知道何时可以/应该将数据框列添加到方法的参数中?
- javascript - 解决 JS 中的异步生产者-消费者问题
- ios - 从 Firebase 数据库中检索用户数据并显示在用户配置文件文本字段中
- php - 我想在特定的帖子页面中添加自定义字段,并在 woocommerce 单品页面中输出内容
- angular - 在 Angular 7 中读取 cookie
- dao - 如何使用 DAO 插入雪花变体字段?