Обратите внимание, что текущая цена жестко закодирована (38), поскольку она не указана, ее необходимо будет указать в другой таблице, которая будет присоединена к таблице запасов, но принцип тот же.
create table stocks (stock varchar2(10),shares number, price number);
insert into stocks values('A', 100, 50);
insert into stocks values('A', -20, 60);
insert into stocks values('A', 50, 40);
select stock, sum(shares) number_of_shares, round(sum(shares*price)/sum(shares),2) average_price,
sum(shares*price) amount_paid, sum(shares*38) value,
round((sum(shares*38)-sum(shares*price))/sum(shares*price)*100,2)||'%' rate_of_return
from stocks
group by stock
STOCK NUMBER_OF_SHARES AVERAGE_PRICE AMOUNT_PAID VALUE RETURN
A 130 44.62 5800 4940 -14.83%