You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于库存数据集计算次日期初/异动/期末库存的SQL查询需求

库存计算SQL解决方案

没问题,我来帮你搞定这个库存统计的需求!先把整个场景和数据理清楚:

原始库存数据

下面是给定的库存异动数据集:

DateItemcodeRec or OutDocTypeQty
01/01/2020100011RecGRN100
01/01/2020100011OutFA50
01/01/2020100011OutFA10
02/02/2020100011OutFA30
02/02/2020100011RECGRN100

需求与计算规则

我们需要计算2020年2月2日的期初库存、当日异动及期末库存,规则如下:

  • OpeningStock(期初库存):首日(2020年1月1日)所有入库(Rec)数量总和减去所有出库(Out)数量总和
  • FA:目标日(2020年2月2日)所有FA类型的出库数量总和
  • GRN:目标日(2020年2月2日)所有GRN类型的入库数量总和
  • ClosingStock(期末库存):期初库存 + GRN入库量 - FA出库量

对应的SQL查询语句

我用CTE(公共表达式)来拆分计算逻辑,让代码更清晰易读:

WITH opening_stock_calc AS (
    SELECT 
        Itemcode,
        -- 计算首日的期初库存:入库总和 - 出库总和
        SUM(CASE WHEN LOWER("Rec or Out") = 'rec' THEN Qty ELSE 0 END) - 
        SUM(CASE WHEN LOWER("Rec or Out") = 'out' THEN Qty ELSE 0 END) AS OpeningStock
    FROM inventory
    WHERE Date = '01/01/2020'
    GROUP BY Itemcode
),
daily_movements_calc AS (
    SELECT 
        Itemcode,
        -- 统计目标日的FA出库总量
        SUM(CASE WHEN DocType = 'FA' THEN Qty ELSE 0 END) AS FA,
        -- 统计目标日的GRN入库总量
        SUM(CASE WHEN DocType = 'GRN' THEN Qty ELSE 0 END) AS GRN
    FROM inventory
    WHERE Date = '02/02/2020'
    GROUP BY Itemcode
)
-- 合并计算结果,得到最终的库存统计
SELECT 
    osc.Itemcode,
    osc.OpeningStock,
    dmc.FA,
    dmc.GRN,
    osc.OpeningStock + dmc.GRN - dmc.FA AS ClosingStock
FROM opening_stock_calc osc
INNER JOIN daily_movements_calc dmc 
    ON osc.Itemcode = dmc.Itemcode;

代码说明

  1. opening_stock_calc:专门计算2020年1月1日的期初库存,用LOWER()处理Rec or Out列的大小写差异(数据里有RecREC两种写法),避免统计遗漏。
  2. daily_movements_calc:统计2020年2月2日的两类异动总量。
  3. 最后通过内关联把两个结果合并,计算出期末库存。

查询结果

执行上述SQL后,会得到符合预期的结果:

ItemcodeOpeningStockFAGRNClosingStock
1000114030100110

内容的提问来源于stack exchange,提问作者infotech.ang

火山引擎 最新活动