我想计算一下公司在某些特定日期的股票。由于我们没有股票表,我需要根据股票走势来计算。ENTRAN
=增加,SALEN
=减少,从该日期之前的最后一个库存开始。
我必须检查的日期是销售前股票走势的最后几天。
我想把我的销售表和库存表连接起来。
股票走势表(MOVSTOCKS
(如下所示:
SKU entran salen codalm fecdoc tipdoc
ART1 50 10 2 01-03-2021 IN
ART1 100 2 03-03-2021 AC
ART1 30 2 05-03-2021 AV
ART2 100 50 2 01-03-2021 IN
ART2 50 2 02-03-2021 AV
ART2 30 50 2 03-03-2021 IN
ART2 20 2 03-03-2021 AV
ART2 50 2 04-03-2021 AC
ART2 30 2 05-03-2021 AV
每个IN
都是一个库存。当有库存时,我必须取ENTRAN
值,并从中不断计算,添加或减少单位。
AC
是采购,AV
是销售。
因此,销售表(LINEALBA
(应该显示这些数据以及其他列:
Date SKU QTY Cumulative
05-03-2021 ART1 30 150
02-03-2021 ART2 50 100
03-03-2021 ART2 20 30
05-03-2021 ART2 30 60
每一行都是一个销售(AV
(,cumulative
列查看该销售之前的最后一个库存01-03-2021
或03-03-2021
,它添加和减去数量,并显示销售前一天的计算库存。
这是我的查询(不起作用(:
select *
from (select m*,
LastInventory + sum(m.entran - m.salen)
over (partition by m.codart order by m.fecdoc) as cumulative,
max(m.fecdoc) over (partition by m.codart) as max_fecdoc,
m.fecdoc
from MovStocks m
left join LINEALBA l on l.codart = m.codart
left join (select m2.codart as SKU,
m2.entran as LastInventory,
max(m2.fecdoc) over (partition by m2.codart, m2.tipdoc) as LastDateinventory,
m2.fecdoc
from MovStocks m2
where m2.codalm in (2)
and m2.tipdoc = 'IN') m2
on m2.CODART = m.codart
where m.codalm in (2)
and m2.fecdoc = LastDateinventory
and m.fecdoc < v.fecha
and m.fecdoc > LastDateinventory
and LastDateinventory < v.fecha
and m.tipdoc <> 'IN') m
where max_fecdoc = m.fecdoc
我的想法是创建一个子查询,或者CTE,Idk,它可以查看销售前的最后一个库存是什么时候,以及销售前的最近一次移动是什么时候。然后以库存为基础计算库存(就像它是0一样(。
出于某种原因,我的查询没有正确计算此累积值。我不知道是过滤器有问题,还是我的子查询不正确。。。
任何帮助都将不胜感激。非常感谢。
分而治之!
-- Add sequence number with SKU.
-- Rows may be uniquely identify by SKU & seq number.
With Qry1 As (
SELECT SKU,
entran,
salen,
codalm,
fecdoc,
tipdoc,
ROW_NUMBER() OVER(Partition By SKU Order By fecdoc) As Seq
FROM MOVSTOCKS
),
-- Get seq # of most recent inventory for each SKU.
Qry2 As (
SELECT qry11.sku,
qry11.seq,
max(qry12.seq) as prev_inv_seq
FROM Qry1 qry11
inner join Qry1 qry12
on qry11.sku = qry12.sku
and qry11.fecdoc >= qry12.fecdoc
where qry12.tipdoc = 'IN'
group by qry11.sku,
qry11.seq
),
-- Get quantity of most recent inventory for each SKU.
Qry3 As (
SELECT qry2.sku,
qry2.seq,
qry1.entran as prev_inv_entran
FROM Qry2
inner join Qry1
on qry2.sku = qry1.sku
and qry2.prev_inv_seq = qry1.seq
),
-- Get sum of purchase quantities since most recent inventory for each SKU.
Qry4 As (
SELECT qry2.sku,
qry2.seq,
sum(qry1.entran) as sum_entran
FROM Qry2
inner join Qry1 qry1
on qry2.sku = qry1.sku
where qry1.seq > qry2.prev_inv_seq
and qry1.seq < qry2.seq
AND qry1.tipdoc = 'AC'
group by qry2.sku,
qry2.seq
),
-- Get sum of sales quantities since most recent inventory for each SKU.
Qry5 As (
SELECT qry2.sku,
qry2.seq,
sum(qry1.salen) as sum_salen
FROM Qry2
inner join Qry1 qry1
on qry2.sku = qry1.sku
where qry1.seq > qry2.prev_inv_seq
and qry1.seq < qry2.seq
AND qry1.tipdoc = 'AV'
group by qry2.sku,
qry2.seq
)
-- Pull it all together...
SELECT qry1.fecdoc As Date,
qry1.SKU,
qry1.salen As Quantity,
qry3.prev_inv_entran + IsNull(qry4.sum_entran, 0) - IsNull(qry5.sum_salen, 0) as Cumulative
FROM qry1
left JOIN Qry3
on qry3.sku = qry1.sku
and qry3.seq = qry1.seq
left JOIN Qry4
on qry4.sku = qry1.sku
and qry4.seq = qry1.seq
left JOIN Qry5
on qry5.sku = qry1.sku
and qry5.seq = qry1.seq
WHERE qry1.tipdoc = 'AV'