根据 SQL 中的销售和生产计算未来库存

Calculate future inventory based an sales and production in SQL

我有 4 个表:存储、销售、生产、生产成本

存储示例

Day ProductID Amount
2022-03-27 1 900
2022-03-27 2 1200
2022-03-28 1 950
2022-03-28 2 1200

销售示例

Date ProductID Amount
2022-04-2 1 50
2022-04-15 1 20

制作示例

Date ProductID Amount
2022-04-1 1 70
2022-04-20 1 10

生产成本示例

ProductID 1 2 glue
1 0 1 1
2 0 0 1

生产成本描述了您是否需要生产某种产品以及需要多少产品。在本例中,您需要 1 个产品 2 和 1 个胶水来生产产品 1。

我想根据 SQL 的未来销售和生产来计算我未来的库存。我使用了一些 golang 代码,但如果 SQL 查询单独完成,我会更喜欢。

我尝试了不同的联接,但我无法弄清楚如何正确减去值并形成新行。

这里我们从存储中获取最新的库存数据,总结自此以来生产和销售的数量(忽略前面的行)并计算今天的库存数量。
我在连接中包含了 table Production_cost 但没有使用它。是否应将所有乘积 2 转换为 1?

create table Products(
id int primary key);
insert into Products values
(1),
(2);
create table storage(
Day   date,
ProductID int ,
Amount int,
foreign key fk_storage_productID(ProductID) references Products(id));
insert into storage values
('2022-03-27',    1,900),
('2022-03-27',    2,1200),
('2022-03-28',    1,950),
('2022-03-28',    2,1200);
create table Sales (
Day Date,
ProductID int,
Amount int,
foreign key fk_sales_productID(ProductID) references Products(id));
insert into Sales values
('2022-04-02',1,50),
('2022-04-15',1,20);
create table Production(
Day Date,
ProductID int,
Amount int,
foreign key fk_production_productID(ProductID) references Products(id));
insert into Production values
('2022-04-1', 1,70),
('2022-04-20',    1,10);
create table Production_Cost(
ProductID int,
p1 int,
p2 int,
glue int,
foreign key fk_production_cost_productID(ProductID) references Products(id));
insert into Production_Cost values
(1,   0,  1,  1),
(2,   0,  0,  1);
select
  p.id as product,
  st.Amount as latest_count,
  coalesce(sum(sa.Amount),0) as sold,
  coalesce(sum(pr.Amount),0) as produced,
  st.Amount -
  coalesce(sum(sa.Amount),0) + 
  coalesce(sum(pr.Amount),0) as calculated_stock
from Products p
left join (
  select ProductID, Day, amount, 
  rank() over (partition by ProductID order by Day desc) rn
  from storage )st on p.id = st.productID
left join Sales sa on p.id = sa.productID
left join Production pr on p.id = pr.productID
left join Production_Cost pc on p.id = pc.productID
where st.rn = 1
and (sa.Day > st.Day or sa.Day is null or st.Day is null)
and (pr.Day > st.Day or pr.Day is null or st.Day is null)
group by 
  p.id,
  st.Amount
product | latest_count | sold | produced | calculated_stock
------: | -----------: | ---: | -------: | ---------------:
      1 |          950 |  140 |      160 |              970
      2 |         1200 |    0 |        0 |             1200

db<>fiddle here