2010-12-21 32 views
0

Ich habe folgende Datenbankstruktur:Nach virtueller Spalte filtern?

[Order] 
OrderId 
Total 

[Payment] 
OrderId 
Amount 

jeder Bestellung X Zahlung Reihen haben. Ich möchte nur die Liste der Bestellungen erhalten, in der die Summe aller Zahlungen < als die Bestellung Total ist.

Ich habe die folgende SQL, aber ich werde alle Bestellungen bezahlt und unbezahlt zurückgeben.

SELECT o.OrderId, 
      o.UserId, 
      o.Total, 
      o.DateCreated, 
      COALESCE(SUM(p.Amount),0) AS Paid 
    FROM [Order] o 
LEFT JOIN Payment p ON p.OrderId = o.OrderId 
GROUP BY o.OrderId, o.Total, o.UserId, o.DateCreated 

Ich habe versucht, hinzuzufügen Wo (Paid < o.Total), aber es funktioniert nicht, eine Idee? BTM Ich benutze SQL CE 3.5

Antwort

4

Was Sie suchen, ist die HAVING-Klausel.

Statt "Wo (COALESCE (SUM (p.Amount), 0) < o.Total)" versuchen "DAS (COALESCE (SUM (p.Amount), 0) < o.Total)"

Überprüfen Sie die MSDN Reference on HAVING.

+0

Sie können eine Spalte Alias ​​in der HAVING-Klausel verweisen, statt –

+0

Wenn ich (Paid Marc

+0

user329957: Können Sie die gesamte Abfrage einfügen? Die Fehlermeldung ist vage. Außerdem enthält der Link, den ich in meiner Antwort angegeben habe, eine Beispiel-SQL, die Sie sich ansehen können. – Jay

0
Select Order.* From Order 
Left Join 
(Select OrderID, Sum(Amount) As t From Payment Group By OrderID) As s On s.OrderID = Oder.OrderID 
Where IsNULL(s.t,0) < Order.Total