当标题中建议的每个员工 ID 缺少快照日期时,我需要通过使用每个 [员工编号] 的 [快照日期] 作为最小和最大日期,在 Azure SQL 数据库的视图中动态显示行。 [快照日期]始终是该月的最后一天。
这样做的原因是,在几个月不活动后,员工将退出各种申请,因此他们的记录在报告中“丢失”。但我们希望继续报告不活动/已删除员工在系统中最后一次出现的日期之后的每个快照周期内的情况。
这就是我的数据目前的样子。
“员工状态”后有大量列,我想将这些列[示例列]中的数据填充为空。
员工编号 - 年月快照 | 快照日期 | 员工编号 | 员工状况 | 示例栏 |
---|---|---|---|---|
999999-2022-12 | 2022-12-31 00:00:00.0000000 | 999999 | 不活动 | 空 |
999999-2022-11 | 2022-11-30 00:00:00.0000000 | 999999 | 不活动 | 空 |
999999-2022-10 | 2022-10-31 00:00:00.0000000 | 999999 | 不活动 | 空 |
999999-2022-09 | 2022-09-30 00:00:00.0000000 | 999999 | 不活动 | 空 |
999999-2022-08 | 2022-08-31 00:00:00.0000000 | 999999 | 不活动 | 空 |
999999-2022-07 | 2022-07-31 00:00:00.0000000 | 999999 | 不活动 | 空 |
999999-2022-06 | 2022-06-30 00:00:00.0000000 | 999999 | 不活跃 | 空 |
999999-2022-05 | 2022-05-31 00:00:00.0000000 | 999999 | 不活动 | 空 |
999999-2022-04 | 2022-04-30 00:00:00.0000000 | 999999 | 不活跃 | 空 |
我想要它的样子:
员工编号 - 年月快照 | 快照日期 | 员工编号 | 员工状况 | 示例栏 |
---|---|---|---|---|
999999-2023-10 | 2023-10-31 00:00:00.0000000 | 999999 | 不活跃 | 空 |
999999-2023-09 | 2023-09-30 00:00:00.0000000 | 999999 | 不活动 | 空 |
999999-2023-08 | 2023-08-31 00:00:00.0000000 | 999999 | 不活动 | 空 |
999999-2023-07 | 2023-07-31 00:00:00.0000000 | 999999 | 不活跃 | 空 |
999999-2023-06 | 2023-06-30 00:00:00.0000000 | 999999 | 不活跃 | 空 |
999999-2023-05 | 2023-05-31 00:00:00.0000000 | 999999 | 不活动 | 空 |
999999-2023-04 | 2023-04-30 00:00:00.0000000 | 999999 | 不活动 | 空 |
999999-2023-03 | 2023-03-31 00:00:00.0000000 | 999999 | 不活动 | 空 |
999999-2023-02 | 2023-02-28 00:00:00.0000000 | 999999 | 不活跃 | 空 |
999999-2023-01 | 2023-01-31 00:00:00.0000000 | 999999 | 不活跃 | 空 |
999999-2022-12 | 2022-12-31 00:00:00.0000000 | 999999 | 不活跃 | 空 |
999999-2022-11 | 2022-11-30 00:00:00.0000000 | 999999 | 不活跃 | 空 |
999999-2022-10 | 2022-10-31 00:00:00.0000000 | 999999 | 不活跃 | 空 |
999999-2022-09 | 2022-09-30 00:00:00.0000000 | 999999 | 不活跃 | 空 |
999999-2022-08 | 2022-08-31 00:00:00.0000000 | 999999 | 不活跃 | 空 |
999999-2022-07 | 2022-07-31 00:00:00.0000000 | 999999 | 不活跃 | 空 |
999999-2022-06 | 2022-06-30 00:00:00.0000000 | 999999 | 不活跃 | 空 |
999999-2022-05 | 2022-05-31 00:00:00.0000000 | 999999 | 不活动 | 空 |
999999-2022-04 | 2022-04-30 00:00:00.0000000 | 999999 | 不活动 | 空 |
更复杂的是,一些员工的快照日期可以追溯到 2017 年 4 月。我只想填充从员工编号存在的最短快照日期开始的数据。
我正在寻找像[https://stackoverflow.com/questions/70393259/insert-rows-of-dates-missing-for-every-id?newreg=ddf9bd38c12545d28ef93cba3bd61d44]这样的解决方案。但是,我无法使用 GENERATE_SERIES,因为我的 SQL Server 版本不支持它并且我无法升级。
有人可以帮忙吗?
您可以使用数字表来模拟此功能。创建包含数字序列的临时表或公用表表达式 (CTE)。然后使用此数字表为每个员工生成指定范围内的日期
您可以使用以下代码作为参考
-- Create a numbers table or use an existing one
CREATE TABLE Numbers (Number INT);
-- Populate the table with numbers from 1 to a large enough value
-- This example populates numbers from 1 to 1000
INSERT INTO Numbers (Number)
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM sys.columns AS A
CROSS JOIN sys.columns AS B;
-- Replace 'YourTableName' with your actual table name
WITH DateRanges AS (
SELECT DISTINCT EmployeeNumber,
DATEADD(MONTH, -Number, EOMONTH(GETDATE())) AS SnapshotDate
FROM YourTableName
CROSS JOIN Numbers
-- Adjust the WHERE condition based on your minimum date requirement
WHERE DATEADD(MONTH, -Number, EOMONTH(GETDATE())) >= 'YourMinDateHere'
)
SELECT CONCAT(EmployeeNumber, '-', FORMAT(SnapshotDate, 'yyyy-MM')) AS 'EmployeeNumber-SnapshotYearMonth',
EOMONTH(SnapshotDate) AS 'SnapshotDate',
EmployeeNumber,
'Inactive' AS 'EmployeeStatus',
NULL AS 'ExampleColumn'
FROM DateRanges
ORDER BY EmployeeNumber, SnapshotDate;