按员工ID关联工时与时薪并计算总人工成本的技术问题
解决方案
方案一:用SQL直接完成计算(推荐)
数据库擅长处理关联与聚合计算,直接通过JOIN关联两张表并完成总和计算,性能更优。注意需先给table1按员工ID分组,确保每个员工的工时单独统计:
SELECT SUM(t1.Hora * t2.Coste) AS TotalCoste FROM ( -- 按员工分组统计工时 SELECT Id_Persona, (SUM(Horas) * 3600)/36000000 AS Hora FROM table1 GROUP BY Id_Persona ) t1 -- 通过员工ID关联时薪表 INNER JOIN table2 t2 ON t1.Id_Persona = t2.Id_CostPers
对应的PHP代码可简化为:
$totalQuery = $DB->Sql("SELECT SUM(t1.Hora * t2.Coste) AS TotalCoste FROM (SELECT Id_Persona, (SUM(Horas)*3600)/36000000 as Hora FROM table1 GROUP BY Id_Persona) t1 INNER JOIN table2 t2 ON t1.Id_Persona = t2.Id_CostPers"); $totalResult = $DB->Row($totalQuery); $total4 = $totalResult->TotalCoste; echo $total4;
方案二:修改PHP代码关联ID计算
如果必须在PHP层处理数据,需先将两个查询结果按员工ID存入关联数组,再遍历完成计算:
- 修正数据存储逻辑,用员工ID作为键存储每个员工的工时和时薪:
// 存储员工工时,键为员工ID $suma1 = []; while($totalSumaHoras = $DB->Row($SumaHoras)){ $suma1[$totalSumaHoras->Id_Persona] = $totalSumaHoras->Hora; } // 存储员工时薪,键为员工ID $suma2 = []; while($totalSumaCoste = $DB->Row($SumaCosteHora)){ $suma2[$totalSumaCoste->Id_CostPers] = $totalSumaCoste->Coste; }
- 遍历数组,通过ID关联计算总费用:
$total4 = 0; foreach($suma1 as $personaId => $hora){ // 确保该员工存在对应的时薪记录 if(isset($suma2[$personaId])){ $total4 += $hora * $suma2[$personaId]; } } echo $total4;
原代码问题说明
- 原
table1的SQL查询未按Id_Persona分组,会将所有员工的工时合并为一条记录,无法获取单个员工的工时数据。 - while循环中直接覆盖变量
suma1和suma2,最终仅保留最后一条查询结果,而非所有员工的数据。 - 未通过员工ID关联两个数据集,无法对应到每个员工的工时与对应时薪。
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

