You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP+SQL计算对应在手库存数量的平均采购成本

按累计数量筛选最近采购记录并计算平均库存成本(PHP+MySQL实现)

需求核心

核算在手库存的实际价值:针对指定商品,按日期/ID降序取最近的采购记录,累计采购数量直到达到或超过在手库存数,最终计算这些对应采购记录的平均成本。比如在手30个叉子,就取能凑够30个的最近采购批次,算出它们的平均采购成本。

最初的低效实现(两步循环法)

一开始用循环递增$limitNumber的方式,反复查询累计数量,直到满足目标值:

// 第一步:循环确定LIMIT值
$limitNumber = 1;
$targetQty = 30; // 在手库存数量
$productID = 'FORK001'; // 示例商品ID

while(true) {
    $sumQuery = "SELECT sum(Quantity) as theSum
                  FROM Receiving
                  WHERE Product='$productID'
                  ORDER BY ID DESC
                  LIMIT $limitNumber";
    // 执行查询,获取$theSum(省略数据库连接/执行代码)
    if ($theSum >= $targetQty) {
        break;
    }
    $limitNumber++;
}

// 第二步:计算平均成本
$avgQuery = "SELECT ID, AVG((Total+Adjustment) / Quantity) as costAvg
              FROM Receiving
              WHERE Product='$productID'
              ORDER BY ID DESC
              LIMIT $limitNumber";

这种方法的问题很明显:数据量大时会发起N次数据库查询,效率极低。

优化后的高效实现(单查询+PHP计算)

利用MySQL用户变量计算累计数量,一次性拉取符合条件的记录,再在PHP中完成平均成本计算:

1. SQL查询语句

SELECT t.ID,
       t.Quantity,
       t.Cost AS rowTotal,
       @running_total := @running_total + t.Quantity AS cumulative_sum
FROM Receiving t
JOIN (SELECT @running_total := 0) r
WHERE t.Product = '$productID'
HAVING @running_total <= $targetQty
ORDER BY t.Date DESC

2. PHP后续计算逻辑

$totalCost = 0;
$totalQty = 0;
// 假设$results是查询返回的结果集
foreach ($results as $row) {
    // 若rowTotal是单位成本则乘数量,若为该行总成本则直接累加
    $totalCost += $row['rowTotal'] * $row['Quantity'];
    $totalQty += $row['Quantity'];
}
// 计算平均成本
$avgCost = $totalCost / $totalQty;

这种方案只需要一次数据库查询,在大数据场景下性能提升非常明显。

内容的提问来源于stack exchange,提问作者Journeyman1900

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:15:35