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

如何使用子查询实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:00:40