我想构建一个 SQL 查询来获取每个人每周的总小时数(结束和开始之间的差值)。 在我的主表中,我有 3 列:
身份证 | 开始DT | 结束DT |
---|---|---|
1 | 2024/01/01 08:00 | 2024年1月1日12:00 |
1 | 2024年1月1日14:00 | 2024年1月1日17:30 |
2 | 2024/09/01 08:00 | 2024年1月1日12:00 |
2 | 2024年10月1日 08:00 | 2024年1月1日11:00 |
2 | 11/01/2024 08:00 | 2024年1月1日10:00 |
3 | 2024/01/01 08:00 | 2024年1月1日10:00 |
3 | 2024/08/01 08:00 | 2024年1月1日12:00 |
3 | 2024年1月15日 08:00 | 2024年1月1日11:00 |
我期待的结果:
身份证 | W01 | W02 | W03 |
---|---|---|---|
1 | 7.5 | 0 | 0 |
2 | 0 | 9 | 0 |
3 | 2 | 4 | 3 |
感谢您的帮助
在 SQL Server 中完成的代码,包含 3 个步骤
解决方案
WITH hours_calculated as (
SELECT [ID]
,[startDT]
,[endDT]
, DATEDIFF(hh, [startDT], [endDT]) as Hours_Difference
, CAST((DAY([startDT])-1)/7 AS INT) +1 AS WeekNumber
FROM [development].[dbo].[hours_by_week]
), weeks_calculated as (
select ID, WeekNumber,SUM(Hours_Difference) as total_hours from hours_calculated group by ID, WeekNumber
)
select ID , [1] as W01,[2] as W02,[3] as W03,[4] as W04,[5] as W05
from weeks_calculated AS SourceTable
pivot
(
SUM(total_hours)
FOR WeekNumber IN ([1],[2],[3],[4],[5] )
) AS PivotTable;
输出
ID W01 W02 W03 W04 W05
1 7 NULL NULL NULL NULL
2 NULL 9 NULL NULL NULL
3 2 4 3 NULL NULL
架构
CREATE TABLE [dbo].[hours_by_week](
[ID] [tinyint] NOT NULL,
[startDT] [datetime2](7) NOT NULL,
[endDT] [datetime2](7) NOT NULL
) ON [PRIMARY]
GO
参考文献