如何在MySQL中计算每位员工的set_num日均平均值
计算员工日均set_num计数的平均值
要得到每位员工每日set_num计数的平均值,需要先统计每个员工每天的set_num数量,再对这些每日数值求平均,同时关联员工的主管信息。以下是修正后的SQL语句:
方法一:使用CTE分步计算
WITH daily_set_counts AS ( -- 第一步:统计每个员工每天的set_num数量 SELECT login, date_set, COUNT(set_num) AS daily_count FROM sarav.set_count GROUP BY login, date_set ) -- 第二步:对每个员工的每日计数求平均,关联员工表获取主管信息 SELECT e.employee, e.supervisor, e.lis_login AS login, ROUND(AVG(dsc.daily_count), 1) AS Avg_Set_Num_Day FROM sarav.employees e JOIN daily_set_counts dsc ON e.lis_login = dsc.login GROUP BY e.employee, e.supervisor, e.lis_login ORDER BY e.supervisor;
方法二:单步计算(总计数除以天数)
如果不需要单独查看每日数据,也可以直接用总set_num计数除以员工的工作天数(去重后的日期数):
SELECT e.employee, e.supervisor, e.lis_login AS login, ROUND(COUNT(s.set_num) / COUNT(DISTINCT s.date_set), 1) AS Avg_Set_Num_Day FROM sarav.employees e JOIN sarav.set_count s ON e.lis_login = s.login GROUP BY e.employee, e.supervisor, e.lis_login ORDER BY e.supervisor;
说明
- 两种方法都会得到相同结果:统计每个员工每天的set_num数量,再计算这些数值的平均值。
- 使用
ROUND(..., 1)是为了匹配你期望的结果格式,保留一位小数。 - 分组时必须包含
employee、supervisor、login三个字段,确保分组逻辑正确,避免聚合错误。
如果你的需求是每日set_num的最大值的平均值(而非计数的平均值),可以修改为以下SQL:
WITH daily_set_max AS ( SELECT login, date_set, MAX(set_num) AS daily_max FROM sarav.set_count GROUP BY login, date_set ) SELECT e.employee, e.supervisor, e.lis_login AS login, ROUND(AVG(dsm.daily_max), 1) AS Avg_Set_Num_Day FROM sarav.employees e JOIN daily_set_max dsm ON e.lis_login = dsm.login GROUP BY e.employee, e.supervisor, e.lis_login ORDER BY e.supervisor;
内容的提问来源于stack exchange,提问作者s.pur.theov
相关产品推荐
相关产品推荐

