Dobre pytanie. Podejście, które obieram, polega na obliczeniu całkowitej sprzedaży. Następnie oblicz skumulowane zakupy i połącz je ze specjalną logiką, aby uzyskać właściwą arytmetykę dla kombinacji:
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
Uwaga:nie testowałem tego zapytania, więc może zawierać błędy składni.