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;
当前问题现象
- 代码生成的供应商总成本表:

- 另一张高亮最低单价的表:

可见系统高亮了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
相关产品推荐
相关产品推荐

