【问题标题】:Inventory Aging Report (FIFO)存货账龄报告 (FIFO)
【发布时间】:2021-09-13 16:43:32
【问题描述】:

有一个问题需要在 SQL Server 中解决,以使用基于 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和仓库组合的剩余数量,并使之前的进货记录剩余数量为零。

预期的报告格式假设报告在 (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

提前致谢。

【问题讨论】:

  • 我投票结束这个问题,因为没有显示出解决问题的努力。
  • @nicomp 很抱歉没有提供我尝试过的选项。这是我在堆栈溢出中的第一个问题,我将改进我的问题写作。感谢您的宝贵反馈。

标签: sql sql-server sql-server-2016


【解决方案1】:

您可以使用窗口函数对一段时间内的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

【讨论】:

  • 正是我想要的,非常感谢@MatBailie。你拯救了我的一天。
  • 如果库存变为负数,则存在波动 :-) 尝试这些值 (999, 'IN', 'XXX', '2021-05-15', 50), (999, 'OUT ', 'XXX', '2021-05-15', 20), (999, 'OUT', 'XXX', '2021-05-16', 40), (999, 'IN', 'XXX', '2021-05-16', 50), (999, 'OUT', 'XXX', '2021-05-17', 5), (999, 'OUT', 'XXX', '2021-05-18 ', 10), (999, 'OUT', 'XXX', '2021-05-19', 26);
  • @GrahamH - 负库存水平实际上是不可能的。如果 OP 需要应对供不应求的问题,则需要细化问题。 (此外,此查询仅显示在应用所有OUTs 后还剩余多少IN0 的答案在供不应求的情况下是正确的。)
  • @MatBailie。在现实世界中,计算出的库存水平可能为负数的原因有很多............会等着看 OP 怎么说。
  • @GrahamH 就像 MatBailie 提到的,这是仓库用例中的库存,当没有现有数量时,不可能下订单。
猜你喜欢
  • 2016-05-07
  • 2017-08-28
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2018-10-12
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多