如何修改SQL Server查询:统计每位员工完成的任务总数及总费率
没问题,我来帮你搞定这个SQL统计需求!
解决SQL Server中员工任务统计问题
首先得明确咱们的表结构(你没给出具体表结构,我先按常见业务场景假设两种情况,你可以根据实际表调整):
场景1:任务表直接记录总段数和单段费率
假设咱们有三张核心表:
Employees:存储员工基本信息,核心字段EmployeeID(员工ID)、EmployeeName(员工姓名)Jobs:存储任务信息,核心字段JobID(任务ID)、TotalSegments(任务总段数)、RatePerSegment(每段费率)EmployeeJob:记录员工和任务的关联关系,核心字段EmployeeID、JobID(表示该员工参与了这个任务)
对应的SQL查询语句如下:
SELECT e.EmployeeID, e.EmployeeName, -- 统计员工完成的任务总数(去重,确保一个任务只算一次) COUNT(DISTINCT j.JobID) AS TotalJobsCompleted, -- 计算总费率:每个任务的总段数×单段费率,再累加所有任务的结果 SUM(j.TotalSegments * j.RatePerSegment) AS TotalRateAmount FROM Employees e JOIN EmployeeJob ej ON e.EmployeeID = ej.EmployeeID JOIN Jobs j ON ej.JobID = j.JobID GROUP BY e.EmployeeID, e.EmployeeName ORDER BY TotalJobsCompleted DESC;
场景2:任务段单独存储(每个段一条记录)
如果任务的每一段都单独存在JobSegments表中(比如JobSegments有JobID、SegmentID、Rate字段),那咱们的SQL就要调整成这样:
SELECT e.EmployeeID, e.EmployeeName, -- 统计任务总数,同样去重任务ID COUNT(DISTINCT js.JobID) AS TotalJobsCompleted, -- 直接累加所有参与任务的所有段的费率 SUM(js.Rate) AS TotalRateAmount FROM Employees e JOIN EmployeeJob ej ON e.EmployeeID = ej.EmployeeID JOIN JobSegments js ON ej.JobID = js.JobID GROUP BY e.EmployeeID, e.EmployeeName ORDER BY TotalJobsCompleted DESC;
关键逻辑说明
- 用
COUNT(DISTINCT JobID)确保一个任务不管有多少段,都只算一个任务,完全符合你说的“员工A完成2个任务”的统计逻辑 - 总费率的计算完全贴合你给出的例子:比如任务1有10段,每段5USD;任务2有20段,每段2USD,总费率就是
10*5 + 20*2 = 90USD,两种场景的SQL都会正确计算这个结果 - 如果你的表结构和假设不一样(比如员工和任务的关联是直接在任务表里,比如
Jobs有EmployeeID1、EmployeeID2字段),那只需要调整JOIN逻辑就行,核心的统计函数是不变的
内容的提问来源于stack exchange,提问作者rspp
相关产品推荐
相关产品推荐

