Goede vraag. De benadering die ik gebruik is om de totale verkoop te berekenen. Bereken vervolgens de cumulatieve aankopen en combineer ze met speciale logica om de juiste rekenkunde voor de combinatie te krijgen:
select s.sku,
(MarginPos - SUM(case when s.totalqty < p.cumeqty - p.qty then p.price * p.qty
when s.totalqty between p.cumeqty - p.qty and p.qty
then s.price * (s.totalqty - (p.cumeqty - p.qty))
else 0
end)
) as Margin
from (select s.sku, SUM(price*qty) as MarginPos, SUM(qty) as totalqty
from sales s
) s left outer join
(select p.*,
(select SUM(p.qty) from purchase p2 where p2.sku = p.sku and p2.sale_id <= p.sale_id
) as cumeqty
from purchase s
)
on s.sku = p.sku
group by s.sku, MarginPos
Opmerking:ik heb deze query niet getest, dus er kunnen syntaxisfouten in voorkomen.