sql - 如何查看滚动五周不同值的时间点?
问题描述
我正在尝试查看滚动五周不同员工支付的时间点。例如,在第 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
解决方案
我假设你有一个这样的数据表:
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 周的年份。
推荐阅读
- html - PowerShell script output to email
- python - 有没有办法直接从枚举实例化一个类?
- firebase - 我可以使用 Firebase google-services.json 配置文件的不同 Android 或 iOS 应用程序是否有任何限制
- pdf - mpdf importPage 8.0 不适用于 1.5 版 PDF
- vba - 错误 3011 VBA 在访问中将所有表导出到 txt
- google-cloud-platform - 从 Google Cloud SQL 数据库导入和导出数据
- html - Power Bi 与使用新 API V2 更新的 ASP.NET WEB FORMS 集成
- c# - 如何在 ASP.NET Core MVC 项目中实现控制台日志记录?
- php - PHP 无法识别 sqlsrv
- python - 迭代 DateTimeIndex 以获得每天的总体情绪