首页 > 解决方案 > 如何查看滚动五周不同值的时间点?

问题描述

我正在尝试查看滚动五周不同员工支付的时间点。例如,在第 48 周,我需要查看从第 44 周到第 48 周支付的不同员工的数量。我想我必须包含类似“WHERE Week_Number BETWEEN Week_Number -5 AND Week_Number”之类的内容,但不知道如何使这项工作. 输出应该只是不同员工 ID 的年份、周数和计数。

SELECT Week_Number,
    Year, 
Account, 
count(distinct EmployeeID as 'EmployeeCount'
FROM [Table]
GROUP BY Week_Number, Year, Account

标签: sqlsql-server

解决方案


我假设你有一个这样的数据表:

YearNumber | WeekNumber | Account | EmployeeID
----------------------------------------------
2019       | 51         | 101     | 1         
2019       | 48         | 101     | 2         

这是您希望看到的结果:

YearNumber | WeekNumber | Account | Quantity
----------------------------------------------
2019       | 48         | 101     | 1         
2019       | 49         | 101     | 1 
2019       | 50         | 101     | 1 
2019       | 51         | 101     | 2 
2019       | 52         | 101     | 2 
2020       | 1          | 101     | 1 
2020       | 2          | 101     | 1 
2020       | 3          | 101     | 1 

因此,一个人在第 48 周开始付款,一个在 51 周开始付款,这意味着他们在账户 101 上的付款在第 51 周和第 52 周重叠,但在其他周,只有一个人向该账户付款。

还要在评论中回答您的问题:我认为这是在您询问 SO 时提供示例数据和预期结果的好方法。


帮助我产生上述结果的查询:

SELECT 
    d.Year + IIF((d.Week + n.Number - 1) >= 52, 1, 0) AS Year, 
    (d.Week + n.Number - 1) % 52 + 1 AS Week,
    d.AccountID,
    COUNT(d.EmployeeID) AS Quantity
FROM Data d
CROSS APPLY (SELECT * FROM Number n WHERE Number BETWEEN 0 AND 4) n
GROUP BY
    d.Year + IIF((d.Week + n.Number - 1) >= 52, 1, 0),  -- Year
    (d.Week + n.Number - 1) % 52 + 1,  -- Week
    d.AccountID

这使用了一个数字表,它基本上是一个包含数字的表——在这样的查询中很有帮助。该代码还对年份转换进行了最少的处理,但请注意,您可能需要关心包含 53 周的年份


推荐阅读