PHP使用while循环计算每年12月社保累计缴费总额问题求解
错误原因
- 非12月的缴费金额未计入累计:你当前的代码只有在遍历到12月的缴费记录时才会修改
$total的值,1-11月的缴费金额完全没有累加,基数本身就错了。 - 12月的金额被重复计算:当
$total初始为0时,你先执行了$total = $array['employee_amount'],紧接着又执行了$total = $total + $array['employee_amount'],相当于12月的金额被加了两次,结果自然偏高。 - 未按年份区分统计逻辑:如果需要输出每年12月的当年累计/历史累计,现有逻辑没有提取年份做判断,跨年统计时会出现逻辑混乱。
修正方案
场景1:统计从首次缴费到每年12月末的历史累计总额
<?php $total = 0; // 查询时按缴费日期排序更稳妥,避免自增ID和日期顺序不一致 $c = mysqli_query($con, "SELECT * FROM payroll_contribution_pssf WHERE employee_id='3' ORDER BY payroll_date ASC"); while($array = mysqli_fetch_array($c)) { // 每一条记录的金额都要累加,不管是哪个月的 $total += $array['employee_amount']; $payrollTimestamp = strtotime($array['payroll_date']); $m = date('m', $payrollTimestamp); // 输出当前记录 echo $array['payroll_date']." ".$array['employee_amount']."<br>"; // 到12月的记录时输出累计值 if($m == 12) { $y = date('Y', $payrollTimestamp); echo $y."年末累计:".number_format($total, 0)."<br>"; } } ?>
场景2:统计每年当年的缴费总额,12月末输出当年累计
<?php $yearTotal = 0; $lastYear = null; $c = mysqli_query($con, "SELECT * FROM payroll_contribution_pssf WHERE employee_id='3' ORDER BY payroll_date ASC"); while($array = mysqli_fetch_array($c)) { $payrollTimestamp = strtotime($array['payroll_date']); $y = date('Y', $payrollTimestamp); $m = date('m', $payrollTimestamp); // 跨年时重置当年累计 if ($lastYear !== null && $y != $lastYear) { $yearTotal = 0; } $yearTotal += $array['employee_amount']; // 输出当前记录 echo $array['payroll_date']." ".$array['employee_amount']."<br>"; // 12月输出当年累计 if($m == 12) { echo $y."年当年累计:".number_format($yearTotal, 0)."<br>"; } $lastYear = $y; } ?>
优化建议
可以直接通过SQL分组统计,不用在PHP层循环遍历计算,效率更高:
-- 统计每年年末累计(历史总累计) SELECT YEAR(payroll_date) AS stat_year, SUM(employee_amount) OVER (ORDER BY YEAR(payroll_date)) AS total_amount FROM payroll_contribution_pssf WHERE employee_id='3' GROUP BY YEAR(payroll_date) -- 统计每年当年累计 SELECT YEAR(payroll_date) AS stat_year, SUM(employee_amount) AS year_total_amount FROM payroll_contribution_pssf WHERE employee_id='3' GROUP BY YEAR(payroll_date)
内容的提问来源于stack exchange,提问作者jadago
相关产品推荐
相关产品推荐

