库存账龄报告 (FIFO)

Inventory Aging Report (FIFO)

在 SQL 服务器中有一个问题需要解决,以使用基于 SKU 和仓库的 FIFO 生成库存老化报告。我在这里附上了架构。

SKU TransactionType WarehouseCode TransactionDate Qty
100 IN WH1 2021-04-30 100
100 IN WH2 2021-04-30 50
101 IN WH1 2021-04-30 30
101 IN WH2 2021-05-01 25
100 OUT WH2 2021-05-02 30
100 OUT WH1 2021-05-02 20
100 OUT WH1 2021-05-04 50
100 OUT WH2 2021-05-04 20
100 OUT WH1 2021-05-05 25
100 IN WH2 2021-05-10 30
100 IN WH1 2021-05-11 30
101 OUT WH2 2021-05-12 20
100 OUT WH1 2021-05-15 30

基于以上schema结构,我需要开发一个基于先进先出(FIFO)的库存老化报表,显示每个SKU和Warehouse组合的剩余数量,并将之前的进货记录剩余数量设为零.

预期的报告格式假设报告 运行 于 (2021-05-20)

SKU TransactionType WarehouseCode TransactionDate Qty Remaining Aging
100 IN WH1 2021-04-30 100 0 21
100 IN WH2 2021-04-30 50 0 21
101 IN WH1 2021-04-30 30 30 21
101 IN WH2 2021-05-01 25 5 20
100 IN WH2 2021-05-10 30 30 11
100 IN WH1 2021-05-11 50 5 10

提前致谢。

可以用window函数对IN条记录随时间求和(累计总和),求出最后的总和OUT.

然后,如果 in_so_far 小于 final_out,您就知道您已经使用了该行的所有内容。

aging 似乎是 datediff() 对常数值?

WITH
  cumulative AS
(
  SELECT
    *,
    SUM(CASE WHEN TransactionType = 'IN' THEN Qty ELSE 0 END)
      OVER (
        PARTITION BY SKU, WarehouseCode
            ORDER BY TransactionDate
      )
        AS qty_in_so_far,
    SUM(CASE WHEN TransactionType = 'OUT' THEN Qty ELSE 0 END)
      OVER (
        PARTITION BY SKU, WarehouseCode
      )
        AS qty_out_final
  FROM
    inventory
)
SELECT
  *,
  CASE
    WHEN qty_out_final > qty_in_so_far
      THEN 0
    WHEN qty_in_so_far - qty_out_final > qty
      THEN qty
      ELSE qty_in_so_far - qty_out_final
  END
    AS qty_final,
  DATEDIFF(day, TransactionDate, '2021-05-20') + 1             AS aging
FROM
  cumulative
WHERE
  TransactionType = 'IN'
ORDER BY
  TransactionDate,
  SKU,
  WarehouseCode

演示...https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=b6725edd625001cd874bdb8f37283763