【发布时间】:2017-10-08 02:57:47
【问题描述】:
我有如下员工:
DECLARE @Employees TABLE
(
[EmployeeID] [int] IDENTITY(1,1) NOT NULL,
[HireDate] [datetime] NOT NULL,
[TerminationDate] [datetime] NULL
)
INSERT INTO @Employees (HireDate, TerminationDate) VALUES ('2016/01/01','2016/01/02')
INSERT INTO @Employees (HireDate, TerminationDate) VALUES ('2016/02/01', '2017/01/30')
INSERT INTO @Employees (HireDate, TerminationDate) VALUES ('2016/03/01', '2016/05/05')
如果我需要知道 2016 年 2 月的在职员工人数,我使用了以下查询:
SELECT * FROM @Employees
WHERE HireDate <= '2016-02-28' AND TerminationDate >= '2016-02-28'
但是,我很难找到一种简单的方法来找到每个月的活跃员工。例如,我想知道每个月从 2016 年 1 月到 2017 年 1 月的活跃员工数量。
我是否需要每个月都有单独的表格并使用一些 CTE 来交叉引用两个表格并提供每个月的报告?任何方向将不胜感激。
到目前为止,我已经有了这些输入。它似乎工作正常,除了 2016 年 1 月我有一名员工活跃但只有 2 天,它没有报告,因为我知道我正在验证月末。有什么调整吗?
DECLARE @startDate DATETIME
DECLARE @endDate datetime
SET @startDate='2014-01-31'
SET @endDate='2017-05-31'
DECLARE @Employees TABLE
(
[EmployeeID] [int] IDENTITY(1,1) NOT NULL,
[HireDate] [datetime] NOT NULL,
[TerminationDate] [datetime] NULL
)
INSERT INTO @Employees (HireDate, TerminationDate) VALUES ('2016/01/01','2016/01/02')
INSERT INTO @Employees (HireDate, TerminationDate) VALUES ('2016/02/01', '2017/01/30')
INSERT INTO @Employees (HireDate, TerminationDate) VALUES ('2016/03/01', '2016/05/05')
;With MyListOfDates( MyCalendarMonthEnd )
AS
(
SELECT @startDate MyCalendarMonthEnd
UNION ALL
SELECT DATEADD(MONTH, 1, MyCalendarMonthEnd)
FROM MyListOfDates
WHERE MyCalendarMonthEnd < @endDate
)
SELECT YEAR(mld.MyCalendarMonthEnd) Year, MONTH(mld.MyCalendarMonthEnd) Month, COUNT(*) ActiveEmployeeCount
FROM MyListOfDates mld
JOIN @Employees e on 1 = 1
WHERE e.HireDate <= mld.MyCalendarMonthEnd and e.TerminationDate >= mld.MyCalendarMonthEnd
GROUP BY mld.MyCalendarMonthEnd
【问题讨论】:
-
您可以使用递归 CTE 生成月份列表,然后将其加入您的表并查找聚合。
-
@GurwinderSingh - 我能够创建月份表列表并进行交叉连接,但想知道输出中的条件/聚合结果是什么
-
您可以创建 2 个数据集,在招聘日期 +1 和 -1 终止日期,然后使用超过此值的运行总计
-
带有窗口函数的运行总计当然只能在 2012+ 上使用,所以如果您在 2008 年需要它,那可能不是最佳选择
-
@JamesZ - 我已经通过试用更新了我的问题;我也可以使用 2014。
标签: sql sql-server sql-server-2008 tsql sql-server-2014