Zum addieren und Subtrahieren von verschiedenen Spalten der Tabelle in MSACCESS
Ich habe drei Tabellen mit: Schüler, StudentPayment und CreditAmount. Ich möchte zeigen das Ergebnis, dass, wie viel ein student Schulden in die Schule. In der Schüler-Tabelle gibt es eine Spalte namens TotalPayable, die den insgesamt zu zahlenden Betrag an die Schule und in StudentPayment gibt es eine Spalte namens TotalPaid, die die gesamte Zahlung jedes mal, wenn er aus-und in die CreditAmount Tabelle gibt es eine Spalte namens CreditAmount ist der Verzicht auf die Summe, die die Schule vermittelt dem Schüler. Also habe ich eine Abfrage :
SELECT Student.TotalPayableAmount -
Sum(StudentPayment.TotalPaid, CreditAmount.WaiverAmount) AS Total_Due
FROM (Student INNER JOIN StudentPayment ON Student.ID = StudentPayment.ID)
INNER JOIN CreditAmount ON (Student.ID = CreditAmount.ID) AND (Student.ID = CreditAmount.StudentID)
GROUP BY Student.ID, Student.TotalPayableAmount, CreditAmount.WaiverAmount
aber es zeigt Fehler.
Eigentlich möchte ich die SUMME von TotalPaid und CreditAmount und dann subtrahieren Sie von der TotalPayable aus der student-Tabelle. Kann mir jemand helfen auf diese bitte. Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
join
wiederholt sich jede Zeile auf der linken Seite für jede Zeile auf der rechten Seite. So ein student mit zwei Zahlungen und drei Kredite würden am Ende mit 6 Zeilen. Wenn Siesum
über, die, würden Sie bekommen das falsche Ergebnis.Stattdessen können Sie eine Unterabfrage verwenden, zum berechnen der Summe der Beträge pro student. Da die Unterabfragen zurückkehren, nur eine Zeile pro Schüler /- in, vermeiden Sie die Zeile Vervielfältigung oben erwähnte problem. Zum Beispiel;
null
Werte. VerwendenNz
statt, oder wennNz
ist nicht verfügbar, verwenden SieIif(IsNull(StudentPayment.TotalPaid), 0, StudentPayment.TotalPaid)
LEFT JOIN
statt einerINNER JOIN
.(t1 INNER JOIN t2 ON t1.f1 = t2.f2) INNER JOIN ...
Waiver
undPaid
?iif(StudentPayment.TotalPaid Is Null, 0, StudentPayment.TotalPaid)
Is Null
operator im Gegensatz zur Verwendung derIsNull
Funktion? Oder ist es nur für stilistische überlegungen?Is Null
sollte schneller sein, weil die db-engine nicht verwenden, eine zusätzliche Funktion. Allerdings habe ich noch nie getestet, also nicht den Anspruch einen performance-Vorteil groß genug, um Materie, oder gar keinen nutzen überhaupt. OTOH, ich kann mir nicht vorstellenIs Null
wäre langsamer als die Funktion. Also, für mich, die Entscheidung basiert auf:IsNull()
nicht nötig und bietet keinen Vorteil, so benutzen Sie es nicht hier.Müssen Sie die Summe jede Tabelle einzeln, dann kommen Sie durch die Schüler-ID.
Hinweis: Wenn Sie dies tun, von einer externen Verbindung (DAO, ADO, ADO.NET) Sie werden nicht in der Lage zu verwenden, die
Nz
Funktion.Iif(IsNull(sum1.ID), 0, sum1.ID)
undIif(IsNull(sum2.ID), 0, sum2.ID)
Nz(sum1.ID)
sollte wohlNz(sum1.TheSum)
, und dieTheSum
Hinzugefügt werden soll alias innerhalb der UnterabfrageIif(IsNull(sumTotalPaid), 0, sumTotalPaid)
undIif(IsNull(sumCreditAmount), 0, sumCreditAmount)