基于库存数据集计算次日期初/异动/期末库存的SQL查询需求
库存计算SQL解决方案
没问题,我来帮你搞定这个库存统计的需求!先把整个场景和数据理清楚:
原始库存数据
下面是给定的库存异动数据集:
| Date | Itemcode | Rec or Out | DocType | Qty |
|---|---|---|---|---|
| 01/01/2020 | 100011 | Rec | GRN | 100 |
| 01/01/2020 | 100011 | Out | FA | 50 |
| 01/01/2020 | 100011 | Out | FA | 10 |
| 02/02/2020 | 100011 | Out | FA | 30 |
| 02/02/2020 | 100011 | REC | GRN | 100 |
需求与计算规则
我们需要计算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;
代码说明
opening_stock_calc:专门计算2020年1月1日的期初库存,用LOWER()处理Rec or Out列的大小写差异(数据里有Rec和REC两种写法),避免统计遗漏。daily_movements_calc:统计2020年2月2日的两类异动总量。- 最后通过内关联把两个结果合并,计算出期末库存。
查询结果
执行上述SQL后,会得到符合预期的结果:
| Itemcode | OpeningStock | FA | GRN | ClosingStock |
|---|---|---|---|---|
| 100011 | 40 | 30 | 100 | 110 |
内容的提问来源于stack exchange,提问作者infotech.ang




