SQL实现所有商品发料前库存查询的方法
全量商品发料前库存查询实现方案
要实现全量商品的发料前库存统计,核心是将单商品查询中硬编码的商品编码条件替换为两表的商品编码关联,同时处理无发料记录商品的空值问题,以下是两种可直接复用的写法:
写法1:LEFT JOIN预聚合结果(推荐,大数据量场景性能更好)
先对发料明细表按商品维度聚合计算累计发料量,再左关联商品主表,保证所有商品都被统计到:
SELECT i.itemCode, i.Available_Qty + COALESCE(iss.total_issued_qty, 0) AS pre_issue_stock FROM Item i LEFT JOIN ( SELECT ItemCode, SUM(Issued_Qty) AS total_issued_qty FROM Items_In_Issue_Note GROUP BY ItemCode ) iss ON i.itemCode = iss.ItemCode
这里用LEFT JOIN而非INNER JOIN,是为了保留从未产生过发料记录的商品,这类商品的发料前库存等于当前可用库存。
写法2:关联子查询(和现有单商品写法逻辑一致,易理解)
保留你原有单商品查询的结构,仅把子查询里的硬编码商品条件改为和外层Item表的字段关联即可:
SELECT i.itemCode, i.Available_Qty + COALESCE( (SELECT SUM(Issued_Qty) FROM Items_In_Issue_Note iss WHERE iss.ItemCode = i.itemCode), 0 ) AS pre_issue_stock FROM Item i
注意事项
- 不可省略空值处理逻辑:如果某商品没有任何发料记录,累计发料量的计算结果会返回
NULL,数值和NULL做加法结果仍为NULL,会导致这类商品的计算结果缺失。COALESCE是所有主流SQL数据库通用的空值转换函数,也可以根据你用的数据库替换为对应函数,比如MySQL的IFNULL、SQL Server的ISNULL。 - 注意字段名大小写匹配:你给出的示例代码中,Item表的商品编码字段写为小写
itemCode,发料明细表的商品编码字段写为大写开头ItemCode,实际编写时要和数据库内的字段命名保持一致,避免报字段不存在的错误。 - 不要过滤无发料记录的商品:如果用INNER JOIN关联两表,会把从未发过料的商品排除在结果外,导致统计不全。
内容的提问来源于stack exchange,提问作者Tharindu
相关产品推荐
相关产品推荐

