根据 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
我有 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