2016-06-08 25 views
1

Ich habe 4 Tabellen Bücher (id, BkName) Clients (id, C_name) empfangen (id, Buch, Amount) Geliefert (ID, Buch, Kunde, Betrag) Ich kann das gleiche Buch viele Male erhalten und es oft an den gleichen Kunden oder mehr als einen Kunden liefern. , als ich versuchte, um herauszufinden, welche Bücher und wie viele von ihnen empfangen und noch nicht geliefert, tat ich dies:SQL Query geben falsche Sums bei dem Versuch, wiederholte Elemente in (Recieved Table & Recieved Tabelle) zu berechnen

SELECT Books.BkName, 
     Sum(Recieved.Amount) AS [Recieved Sum], 
     Sum(Delivered.Amount) AS [Delivered Sum] 
FROM (Books LEFT JOIN Recieved ON Books.id = Recieved.Book) 
     LEFT JOIN Delivered ON Books.id = Delivered.Book 
GROUP BY Books.BkName; 

Ich habe falsch Sums (mehr als die Menge der Bücher, die ich empfangen oder geliefert) und I konnte keine Möglichkeit finden, Subtrahieren (Empfangen - Geliefert), um das Ergebnis zu erhalten. Vielen Dank im Voraus für Ihre Zeit ..

Antwort

2

Diese Art der Abfrage ist wahrscheinlich am besten korrelierten Unterabfragen durchgeführt werden:

select Books.*, 
     (select Sum(Received.Amount) from Received where Books.id = Received.Book) as ReceivedTotal, 
     (select Sum(Delivered.Amount) from Delivered where Books.id = Delivered.Book) as DeliveredTotal 
from Books; 

Das Problem mit Ihrer Version ist, dass es ein Kartesisches Produkt der empfangenen und gelieferten Datensätze erstellt für jedes Buch. Daher enden die Summen weit weg.

Hinweis: In Englisch ist das Wort "erhalten" nicht "erhalten". Es gibt einen alten mnemonischen Trick, "ich 'vor' e ', außer nach' c 'oder wenn es wie ein' a 'klingt, wie beim, Nachbarn' und, wiegen '". Natürlich, da es Englisch ist, gibt es Zillionen von Ausnahmen sogar für die Regel.

+0

Vielen Dank für Ihre Hilfe, es war eine große Hilfe für mich .. Ich kenne den alten mnemonic Trick, den Sie erwähnten, aber es fiel mir dieses Mal nicht ein .. würden Sie bitte ein SQL-Buch empfehlen, das helfen kann ich, um mein Wissen darüber zu verbessern .. –