使用CASE WHEN聚合分组:员工周工时统计查询问题
问题解决:统计每周不同地点工时达标员工数
你的查询问题出在直接对每日的工时记录进行判断统计,但需求是统计员工每周的总工时是否符合条件,而非每日记录的数量。源表是每日薪资数据,需要先按员工、周、地点汇总出每个员工每周的总工时,再基于这个汇总结果统计符合条件的员工ID数量。
正确的SQL查询语句
-- 第一步:先计算每个员工每周在对应地点的总工时 WITH weekly_hours AS ( SELECT [EMPLOYEE_ID], [WEEKENDING], [LOCATION], SUM([PAID_HOURS]) AS total_weekly_hours FROM mydb.payroll GROUP BY [EMPLOYEE_ID], [WEEKENDING], [LOCATION] ) -- 第二步:基于总工时统计符合条件的员工数量 SELECT [WEEKENDING], [LOCATION], SUM(CASE WHEN total_weekly_hours > 30 THEN 1 ELSE 0 END) AS [COUNT_OVER_30], SUM(CASE WHEN total_weekly_hours < 20 THEN 1 ELSE 0 END) AS [COUNT_UNDER_20] FROM weekly_hours GROUP BY [WEEKENDING], [LOCATION]
逻辑说明
- 用CTE(
weekly_hours)先聚合每个员工在每周、对应地点的总工时,确保我们判断的是员工整周的工时情况。 - 再对聚合后的结果按周和地点分组,统计总工时超过30小时和不足20小时的员工数量。
内容的提问来源于stack exchange,提问作者ZRaptor
相关产品推荐
相关产品推荐

