请求生成期初与期末库存数据(附输入输出示例)
计算库存期初与期末数据的解决方案
针对你给出的库存交易数据,我整理了一个基于SQL的高效解决方案,完全匹配你的需求:
核心需求拆解
先明确几个关键逻辑:
PRODUCTKEY:由WAREHOUSECODE和PRODUCT_CODE用连字符拼接生成(比如B12-2210008)TRANSACTION_Qty:同一仓库、产品、日期下所有QUANTITY的总和OPENING_STOCK:对应维度上一日的期末库存,最早日期的期初库存设为0CLOSING_STOCK:直接用OPENING_STOCK加上当日TRANSACTION_Qty即可
SQL实现代码
以下代码兼容大多数现代数据库(如PostgreSQL、MySQL 8.0+、BigQuery等):
-- 第一步:按仓库、产品、日期汇总当日交易总量 WITH daily_transactions AS ( SELECT CONCAT(WAREHOUSECODE, '-', PRODUCT_CODE) AS PRODUCTKEY, WAREHOUSECODE, PRODUCT_CODE, STOCK_DATE, SUM(QUANTITY) AS TRANSACTION_Qty FROM Input_data GROUP BY WAREHOUSECODE, PRODUCT_CODE, STOCK_DATE ), -- 第二步:计算从最早日期到当日的累计库存(即当日期末库存) inventory_running AS ( SELECT *, SUM(TRANSACTION_Qty) OVER ( PARTITION BY PRODUCTKEY ORDER BY STOCK_DATE ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS cumulative_stock FROM daily_transactions ) -- 第三步:生成期初库存,组合最终结果 SELECT PRODUCTKEY, WAREHOUSECODE, PRODUCT_CODE, STOCK_DATE, -- 首日没有历史库存,期初设为0;其余日期取上一日的期末库存 COALESCE(LAG(cumulative_stock) OVER ( PARTITION BY PRODUCTKEY ORDER BY STOCK_DATE ASC ), 0) AS OPENING_STOCK, TRANSACTION_Qty, cumulative_stock AS CLOSING_STOCK FROM inventory_running ORDER BY PRODUCTKEY, STOCK_DATE;
结果验证
运行代码后会得到和你预期完全一致的输出:
| PRODUCTKEY | WAREHOUSECODE | PRODUCT_CODE | STOCK_DATE | OPENING_STOCK | TRANSACTION_Qty | CLOSING_STOCK |
|---|---|---|---|---|---|---|
| B12-2210008 | B12 | 2210008 | 31-DEC-17 | 0 | 7.5 | 7.5 |
| B12-2210008 | B12 | 2210008 | 08-JAN-18 | 7.5 | -1 | 6.5 |
补充说明
如果你的数据库版本较低(比如MySQL 5.x)不支持窗口函数,可以用关联子查询替代,但窗口函数的方式在数据量较大时性能会更优。
内容的提问来源于stack exchange,提问作者viresh
相关产品推荐
相关产品推荐

