同一表多查询与多求和实现:按经理分组统计员工工时
嘿,我来帮你搞定这个按经理分组统计员工工时的需求!根据你给出的表结构和需求,我整理了一套实用的SQL方案,咱们一步步来看:
需求拆解
- 按经理(
SupervisorName/SupervisorNumber)分组,展示其下属所有员工 - 对每个员工,按
TimeType统计该类型的工时总和 - 同时计算每个员工对应月度(
Period)的总工时 - 注意:
ActualHours是字符串类型,必须先转换为数值类型才能做聚合统计
核心SQL查询语句
SELECT -- 经理标识信息 SupervisorNumber, SupervisorName, -- 员工信息 EmployeeName, -- 工时类型及对应累计工时 TimeType, SUM(TRY_CAST(ActualHours AS DECIMAL(18,2))) AS TotalHoursByType, -- 员工月度总工时(同周期下所有工时类型的总和) SUM(SUM(TRY_CAST(ActualHours AS DECIMAL(18,2)))) OVER (PARTITION BY SupervisorNumber, EmployeeName, Period) AS MonthlyTotalHours, Period FROM YourTableName -- 替换成你的实际表名 WHERE -- 过滤掉无法转换为数值的无效工时数据 TRY_CAST(ActualHours AS DECIMAL(18,2)) IS NOT NULL GROUP BY SupervisorNumber, SupervisorName, EmployeeName, TimeType, Period ORDER BY SupervisorName, EmployeeName, Period, TimeType;
代码细节说明
- TRY_CAST的使用:因为
ActualHours是nvarchar(MAX)类型,用TRY_CAST可以避免因数据格式错误导致整个查询崩溃,转换失败的行会被WHERE条件过滤掉 - 分组逻辑:按经理编号/姓名、员工姓名、工时类型、统计周期分组,确保每个分组是同一经理下、同一员工、同一周期的同一工时类型数据
- 窗口函数OVER:不用额外子查询,就能同时算出单工时类型的总和和员工月度总工时,简化查询结构
- 排序规则:最后按经理、员工、周期、工时类型排序,让结果层级清晰,方便阅读
扩展优化:层级汇总查询
如果需要更全面的层级统计(比如先看经理的总工时,再看下属员工的总工时),可以用ROLLUP实现多维度汇总:
SELECT SupervisorNumber, SupervisorName, EmployeeName, TimeType, SUM(TRY_CAST(ActualHours AS DECIMAL(18,2))) AS TotalHours, Period FROM YourTableName WHERE TRY_CAST(ActualHours AS DECIMAL(18,2)) IS NOT NULL GROUP BY ROLLUP(SupervisorNumber, SupervisorName, EmployeeName, TimeType, Period) ORDER BY SupervisorName, EmployeeName, Period, TimeType;
这个查询会自动生成汇总行,比如经理的所有下属总工时、员工的所有工时类型总工时等,满足多维度查看需求。
内容的提问来源于stack exchange,提问作者bobby747
相关产品推荐
相关产品推荐

