Boa tarde,
Experimente fazer uns testes utilizando uma CTE recursiva mais ou menos conforme o exemplo abaixo:
with
CTE_RN as
(
select
v.IDPRODUTO,
v.QUANTIDADE,
l.IDLOTE,
l.SALDO,
row_number() over(partition by l.IDPRODUTO order by l.Validade) as RN
from VENDA as v
inner join LOTE as l
on l.IDPRODUTO = v.IDPRODUTO
),
CTE_REC as
(
select
IDLOTE,
IDPRODUTO,
case when QUANTIDADE > SALDO
then SALDO
else QUANTIDADE
end as QUANTIDADE,
case when QUANTIDADE > SALDO
then cast(QUANTIDADE - SALDO as numeric(19, 2))
else 0
end as RESTO,
RN
from CTE_RN
where
RN = 1
union all
select
n.IDLOTE,
r.IDPRODUTO,
case when r.RESTO > n.SALDO
then n.SALDO
else r.RESTO
end,
case when r.RESTO > n.SALDO
then cast(r.RESTO - n.SALDO as numeric(19, 2))
else 0
end,
n.RN
from CTE_REC as r
inner join CTE_RN as n
on n.IDPRODUTO = r.IDPRODUTO and n.RN = r.RN + 1
where
r.RESTO > 0
)
select
IDLOTE,
IDPRODUTO,
QUANTIDADE
from CTE_REC
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br