您需要将每个订单行的总和与每个订单的每次付款总和进行比较。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 )
编辑
我刚刚注意到您没有在每个订单行上存储销售价格。我已经相应地更新了我的答案,但这是一个非常糟糕的主意。如果商品价格发生变化,您的旧订单会怎样?通过在每个订单行上存储销售时的价格来对数据进行非规范化是可以的(实际上也是最佳实践)。