各注文明細行の合計と、注文ごとの各支払いの合計を比較する必要があります。GROUP BYといくつかのサブクエリは、仕事を成し遂げるために必要なものです。
このようなものが動作するはずです:
SELECT
O.OrderID
FROM [Order] O
INNER JOIN (
-- Add up cost per order
SELECT
OrderID,
SUM(SoldQuantity * P.SalePrice) AS Total
FROM OrderLine
INNER JOIN Product P ON P.ProductID = OrderLine.ProductID
GROUP BY OrderID
) OL ON OL.OrderID = O.OrderID
LEFT JOIN (
-- Add up total amount paid per order
SELECT
OrderID,
SUM(CashMovementValue) AS Total
FROM CashMovement
GROUP BY OrderID
) C ON C.OrderID = O.OrderID
WHERE
O.CustomerID = @custID
AND ( C.OrderID IS NULL OR C.Total < OL.Total )
編集
注文明細ごとに販売価格を保存していないことに気付きました。それに応じて回答を更新しましたが、これは非常に悪い考えです。アイテムの価格が変更された場合、以前の注文はどうなりますか? 各注文ラインの販売時の価格を保存することで、データを非正規化することは問題ありません (実際にはベスト プラクティスです)。