how can i get rid of this sort spill
HAVING (SUM(vl.ActualCost) + SUM(vl.ExpectedCost) <> 0) OR (SUM(ile.quantity) <> 0)
HAVING (SUM(vl.ActualCost + vl.ExpectedCost) + SUM(ile.quantity) <> 0)
(Which is the same semantically, I think, unless you can have negatives for ActualCost or ExpectedCost.)
Getting rid of the OR might take away a layer of guessing, and bring estimates closer to actual.
After that, I might try filtering earlier, or materializing some of the aggregations into their own #temp tables so that they can have their own statistics and so it isn't one big query for the optimizer to try and wrangle.