mysql 在SQL中实现FIFO(先进先出)

ef1yzkbh  于 5个月前  发布在  Mysql
关注(0)|答案(2)|浏览(97)

我有一张存货表
| ID|数量|购买日期|价格|
| --|--|--|--|
| 11202 | 4 |2023年01月01日| 3 |
| 11202 | 3 |2023年12月06日| 7 |
| 5050 | 4 |2023年10月11日| 60 |
| 11202 | 4 |2023年10月12日| 5 |
| 5050 | 8 |2023年12月12日| 70 |
和Item sold表
| ID|数量|
| --|--|
| 11202 | 6 |
我想实施先进先出的概念,我可以找到总价格如下我有数量购买[库存表]在不同的日期。我有数量出售表[项目出售]
让我们说,我卖了6个数量为一个特定的项目在我的情况下项目“11202”我想找到总价格乘以y(购买数量 * 价格)//为第一个订单,然后乘以下一个
4 * 3 = 12(第一个订单日期为2023年1月1日)剩余库存0
2 * 7 = 14(2023年6月12日第二次订购)剩余库存1
12 + 14 = 26总价
我已经连接了类似于joined table的表,但我不知道如何添加一个新列,其中包括剩余项目和总价

1rhkuytd

1rhkuytd1#

一种方法是使用库存和销售的累积总和创建区间,然后根据重叠进行连接:

WITH stock_intervals AS (
    SELECT *,
        SUM(Qty) OVER w - Qty AS IntervalStart,
        SUM(Qty) OVER w AS IntervalEnd
    FROM stock
    WINDOW w AS (PARTITION BY ID ORDER BY DatePurchased)
),
sales_intervals AS (
    SELECT *,
        SUM(Qty) OVER w - Qty AS IntervalStart,
        SUM(Qty) OVER w AS IntervalEnd
    FROM sales
    WINDOW w AS (PARTITION BY ID ORDER BY Dt)
)
SELECT s.ID, s.DatePurchased, s.Qty, s.Price,
    LEAST(d.IntervalEnd, s.IntervalEnd) - GREATEST(d.IntervalStart, s.IntervalStart) AS tQty,
    s.Price * (LEAST(d.IntervalEnd, s.IntervalEnd) - GREATEST(d.IntervalStart, s.IntervalStart)) AS tPrice
FROM stock_intervals s
JOIN sales_intervals d
  ON s.ID = d.ID
  AND s.IntervalStart < d.IntervalEnd
  AND d.IntervalStart < s.IntervalEnd
ORDER BY s.ID, s.DatePurchased;

字符串
注意事项:我将Dt列添加到sales中,这样就可以对累计和进行排序。
这里有一个db<>fiddle

ulydmbyx

ulydmbyx2#

如果你想知道每个条目的总价格:

SELECT date, qty, sold_qty*price AS total FROM <joined_table> WHERE id = <id> ORDER BY date ASC;

字符串
如果您想要项目的总收入:

SELECT id, MIN(qty), SUM(sold_qty * price) AS total
FROM joined_table
GROUP BY id;


假设你的数量总是下降,如果你想要最新条目的数量,你应该使用子查询。
您应该将用于连接表的代码替换为joined_table

相关问题