库存账龄报告 (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
在 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