如何使用子查询实现COUNT()与SUM()?求SQL查询解决方案
帮你搞定这个SQL查询问题
嘿,我来帮你梳理下当前SQL的问题,然后给出符合需求的正确写法~
先说说你原有SQL的几个问题
- 判断NULL的方式错误:SQL里不能用
status = NULL来检查空值,得用status IS NULL,因为NULL是特殊的未知值,普通的等于运算符没法匹配它; - 无关联的多表查询:你直接把
stock_parts和stock_items放在FROM里却没加关联条件,会生成笛卡尔积(所有行的无序组合),结果完全不符合预期; - 缺少shipments表关联:要计算
SumOfItemsCost,必须关联shipments表拿到item_cost字段,原有SQL里根本没涉及这张表。
符合需求的SQL写法
根据你的需求,我分两种常见场景给出写法:
场景1:同一StockPart的可用库存都来自同一个shipment(item_cost相同)
这种情况下,直接用可用数量乘以单条item_cost即可:
SELECT sp.title AS StockPart_title, COUNT(si.id) AS QtyAvailable, COUNT(si.id) * sh.item_cost AS SumOfItemsCost FROM stock_parts sp LEFT JOIN stock_items si ON si.stock_part_id = sp.id AND si.status IS NULL LEFT JOIN shipments sh ON si.shipment_id = sh.id GROUP BY sp.id, sp.title, sh.item_cost;
场景2:同一StockPart的可用库存来自多个shipment(item_cost不同)
如果不同的stock_items对应不同的shipments(item_cost不一样),那SumOfItemsCost应该是所有符合条件的stock_item的item_cost总和,这时候写法调整为:
SELECT sp.title AS StockPart_title, COUNT(si.id) AS QtyAvailable, SUM(sh.item_cost) AS SumOfItemsCost FROM stock_parts sp LEFT JOIN stock_items si ON si.stock_part_id = sp.id AND si.status IS NULL LEFT JOIN shipments sh ON si.shipment_id = sh.id GROUP BY sp.id, sp.title;
写法解释
- 用
LEFT JOIN关联stock_parts和符合条件的stock_items(status IS NULL),这样即使某个StockPart没有可用库存,也会在结果里显示(QtyAvailable为0,SumOfItemsCost为NULL); - 通过
stock_items.shipment_id关联shipments表,拿到对应的item_cost; COUNT(si.id)用来统计符合条件的stock_items数量,也就是你要的QtyAvailable;GROUP BY子句确保按每个StockPart分组计算,避免重复数据。
内容的提问来源于stack exchange,提问作者anderlaini
相关产品推荐
相关产品推荐

