使用 SUM 中的自定义列进行 SQL 查询

问题描述 投票:0回答:1

我想构建一个 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 select calculated-columns
1个回答
0
投票

在 SQL Server 中完成的代码,包含 3 个步骤

  1. 创建 CTE 查询来计算时差和周数
  2. 创建 CTE 查询以按 ID 和周数添加小时数
  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

参考文献

在sql server中按特定月份的周进行分组

如何获取sql server中两个日期之间的总小时数?

© www.soinside.com 2019 - 2024. All rights reserved.