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

PHP MySQL查询含小数时MIN()无法获取最小值求助

问题:计算各供应商对应最低单价的总成本

需求是获取每个供应商对应最低单价的总成本,总成本为「商品数量 × 单位成本」的总和。

当前使用的代码

SELECT Name, SUM(Total) as Total 
  FROM ( SELECT MIN(CASE WHEN bidding.FK_itemId THEN CONCAT(bidding.unitCost, ' - ', 
                supplier.supplierName) END) as 'Cost', 
                supplier.supplierName as 'Name', 
                MIN(bidding.unitCost*item.quantity) as 'Total' 
           FROM bidding 
           LEFT JOIN item ON bidding.FK_itemId = item.PK_itemId 
           LEFT JOIN supplier on bidding.FK_supplierId = supplier.PK_supplierId 
          WHERE bidding.dateAdded = CURDATE() 
          GROUP BY item.itemDesc ORDER BY bidding.FK_itemId
       ) T 
 GROUP by Name;

当前问题现象

  1. 代码生成的供应商总成本表:
    供应商总成本表
  2. 另一张高亮最低单价的表:
    高亮最低单价的表
    可见系统高亮了9.5的单价,但计算总成本时却错误地将10当作该商品的最低单价来统计。

问题根源与修正方案

问题核心

原代码逻辑存在两处关键错误:

  • 内层GROUP BY item.itemDesc后用MIN(bidding.unitCost*item.quantity),是取每个商品下「单价×数量」的最小值,而非先找到该商品的最低单价,再用这个单价乘以数量计算成本。
  • 内层的MIN(CASE...)逻辑混乱,没有正确关联到对应最低单价的供应商信息。

修正后的SQL

先定位每个商品的最低单价,再关联对应供应商与商品数量,最后按供应商汇总总成本:

-- 第一步:获取当日每个商品的最低单价
WITH item_min_cost AS (
    SELECT 
        FK_itemId,
        MIN(unitCost) AS min_unitCost
    FROM bidding
    WHERE dateAdded = CURDATE()
    GROUP BY FK_itemId
)
-- 第二步:关联数据并按供应商汇总总成本
SELECT 
    s.supplierName AS Name,
    SUM(i.quantity * imc.min_unitCost) AS Total
FROM item_min_cost imc
JOIN bidding b ON imc.FK_itemId = b.FK_itemId AND imc.min_unitCost = b.unitCost
JOIN item i ON b.FK_itemId = i.PK_itemId
JOIN supplier s ON b.FK_supplierId = s.PK_supplierId
WHERE b.dateAdded = CURDATE()
GROUP BY s.supplierName;

补充说明

如果某个商品存在多个供应商报出相同最低单价,上述代码会将这些供应商的该商品成本全部统计。若需仅筛选其中一个(如最早报价的供应商),可在item_min_cost中加入MIN(dateAdded)等条件来锁定唯一记录。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 12:18:25