2013-03-17 1 views
1

Je veux obtenir tous les numéros d'identification de commande pour le client sélectionné qui ne payé jusqu'à présent, mes données montrent comme suit:Comment obtenir tous les ID de commande qui n'ont pas été payés dans SQL Server 2008?

enter image description here

Ce que je veux est d'écrire une instruction SELECT qui répond à cette question:

select orderID 
from order 
where customer id = @custID 
and Total cashmovementValue 
     for current order id 
    is less than total (sold quantity * salePrice) 
     for current order id 

Comment le faire?

Merci.

Répondre

0

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.

+0

Merci Bennor McCarthy, qui a travaillé –