Vous devez comparer la somme de chaque ligne de commande avec la somme de chaque paiement par commande. GROUP BY et quelques sous-requêtes est ce dont vous avez besoin pour faire le travail.
Quelque chose comme cela devrait fonctionner:
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)
EDIT
Je viens de remarquer que vous ne stockez pas le prix de vente sur chaque ligne de commande. J'ai mis à jour ma réponse en conséquence, mais c'est une très mauvaise idée. Qu'adviendra-t-il de vos anciennes commandes si le prix d'un article change? Il est correct (et en fait la meilleure pratique) de dénormaliser les données en stockant le prix au moment de la vente sur chaque ligne de commande.
Merci Bennor McCarthy, qui a travaillé –