No lo he hecho antes, pero
según esto sería:
Código SQL
[-]
SELECT SUM(IMP)
FROM( select M.IMP FROM expemov M INNER JOIN EXPEDIENTES E ON E.ID = M.IDEXP
WHERE M.IDEXP between :EXP1 AND :EXP2 AND DH = 'D' AND SDP = 'P'
HAVING SUM(IMP) <> 0
union all
select -m.IMP FROM expemov m INNER JOIN EXPEDIENTES E ON E.ID = M.IDEXP
WHERE M.IDEXP between :EXP1 AND :EXP2 AND DH = 'H' AND SDP = 'P') AS T
AND M.IMP <> 0
MINUS
SELECT SUM(IMP) FROM EXPEPRV WHERE IDEXP between :EXP1 AND :EXP2
HAVING SUM(IMP) <> 0
...me extraría que funcionase