Hola Nes24.
 
Esta sería la idea... siguiendo un poco la lógica del compañero Huesos52, aunque utilizando JOIN's: 
Considerando que un producto tenga una y solo una venta y una y solo una compra podrías hacerlo así:    
Código MySQL:
Ver original+---------+------------+----------------+-------+
| idVenta | idProducto | tipoMovimiento | coste |
+---------+------------+----------------+-------+
|       1 |          1 | venta          |  5500 |
|       2 |          1 | compra         |  4500 |
|       3 |          4 | venta          |  1000 |
|       4 |          4 | compra         |   800 |
+---------+------------+----------------+-------+
 
mysql
> SELECT m.idProducto
, v.coste
, c.coste
, v.coste 
- c.coste ganancia
    -> INNER JOIN movimientos v 
ON m.idProducto 
= v.idProducto
     -> AND v.tipoMovimiento 
= 'venta'     -> INNER JOIN movimientos c 
ON m.idProducto 
= c.idProducto
     -> AND c.tipoMovimiento 
= 'compra'     -> GROUP BY m.idProducto
, v.idProducto
, c.idProducto
; +------------+-------+-------+----------+
| idProducto | coste | coste | ganancia |
+------------+-------+-------+----------+
|          1 |  5500 |  4500 |     1000 |
|          4 |  1000 |   800 |      200 |
+------------+-------+-------+----------+
  
Considerando que un producto pueda tener n ventas y m compras, podrías hacerlo así:    
Código MySQL:
Ver originalmysql
> SELECT m.idProducto
, v.coste
, c.coste
, v.coste 
- c.coste ganancia
    -> WHERE tipoMovimiento 
= 'venta'     -> GROUP BY idProducto
) v 
ON m.idProducto 
= v.idProducto
     -> WHERE tipoMovimiento 
= 'compra'     -> GROUP BY idProducto
) c 
ON m.idProducto 
= c.idProducto
 +------------+-------+-------+----------+
| idProducto | coste | coste | ganancia |
+------------+-------+-------+----------+
|          1 |  5500 |  4500 |     1000 |
|          4 |  1000 |   800 |      200 |
+------------+-------+-------+----------+
  
Saludos
Leo.