2017-07-19 5 views
0

Leute. Ich kann keine Antwort auf dieses Problem finden. Ich kann es in SQL Server tun, aber ich arbeite jetzt mit Access 2013 und meine üblichen SQL-Tricks scheinen nicht zu funktionieren.Summierung von Summen aus mehreren Tabellen in MS Access

Ich muss einen Klassenkosten v. Umsatzzusammenfassung Bericht erstellen.

Ich habe drei Tabellen: Klassenliste, Kostenliste, Registrierungsliste. Die Kosten und Registrierungen (Kosten & Umsatz) sind beide an die Klassenliste gebunden durch ein Schlüsselfeld, das diese Klasse für alle Tabellen identifiziert.

Ich kann einen Kostenbericht oder einen Umsatzbericht erstellen und die Summen für jede Klasse sind in Ordnung, aber wenn ich sie kombinieren, um das Netz für jede Klasse zu erhalten, werden die Kosten mit der Anzahl der Zeilen in der Registrierung multipliziert Bericht und umgekehrt.

Ich habe versucht, Outer Join verwenden, aber der Zugriff mag es nicht, auch mit der [] an der richtigen Stelle. Es wäre besser, dies im Zugriff zu behalten, da sich der Weg von der Excel-Version entfernt.

tables and expected results

incorrect results

Hier ist die SQL hinter den schlechten Ergebnissen. Ich weiß, dass diese Joins falsch sind, aber ich kann keine anderen Joins annehmen.

SELECT DISTINCTROW Classes.ID, 
     Classes.Title, 
     Classes.Instructor, 
     Classes.Date, 
     Sum(Costs.Amount) AS [Sum Of Amount], 
     Sum(Registrations.Tuition) AS [Sum Of Tuition], 
     Count(*) AS [Count Of Classes] 
FROM (Classes 
     LEFT JOIN Registrations ON Classes.[ID] = Registrations.[Class ID]) 
LEFT JOIN Costs ON Classes.[ID] = Costs.[Class ID] 
GROUP BY Classes.ID, 
     Classes.Title, 
     Classes.Instructor, 
     Classes.Date; 

Irgendwelche Vorschläge? Danke im Voraus.

+0

Erstellen Sie eine Gesamtabfrage für Kosten und eine Gesamtabfrage für Umsatz, und verbinden Sie dann die zwei Sammelabfragen zur Klassenlistentabelle. – June7

+0

Willkommen bei SO. Zuallererst, siehe [LINKE und RECHTE JOIN-Operationen] (https://support.office.com/de-de/article/LEFT-JOIN-RIGHT-JOIN-Operations-ebb18b36-7976-4c6e-9ea1-c701e9f7f5fb). Die SQL-Syntax, einschließlich JOIN-Schlüsselwörtern, ist nicht identisch mit SQL Server. –

+0

Sie erwähnen "SQL-Tricks", "jede andere Art von Join" und die Möglichkeit, "es in SQL Server zu tun". Wenn Sie solche Dinge ausprobiert haben oder wenn Sie denken, dass eine andere Syntax woanders funktioniert, kann es sich lohnen, solche Beispiele mit aufzunehmen, anstatt sie nur zu erwähnen. Das kann nicht nur etwas bieten, mit dem man arbeiten kann, sondern auch Details aufdecken, die vielleicht nicht in Worten auftauchen. Ich sehe nicht, wie eine Join oder Syntax Sie eine einzelne Abfrage ausführen lassen würde, um Aggregate über verschiedene Tabellen zu erhalten. Auch wenn es sich um Unterabfragen handelt, müssen Sie die Kosten und die Studiengebühren separat zusammenfassen. –

Antwort

0

Sie benötigen zwei separate Abfragen, um Werte für unterschiedliche Tabellen zusammenzufassen, obwohl sie mit derselben Primärtabelle verknüpft sind. Andernfalls führt der SELECT-Teil der SQL-Anweisung einen Kreuz-Join für die beiden anderen Tabellen aus, wodurch jeder Kostenwert für jede Registrierung effektiv neu ausgewählt wird. Dieser Auswahlprozess findet vor dem Gruppieren und Aggregieren statt (d. H. Summe, Anzahl). Deshalb bekommst du die multiplizierten Summen.

DISTINCTROW ist ineffektiv, da die Abfrage Werte auf Basis von Feldern aus jeder Tabelle im Join auswählt, so dass es effektiv jede Zeile aus dem ursprünglichen Satz behalten muss. DISTINCTROW tut nicht zuerst Zeilen aus einer Tabelle auswählen dann unabhängig Zeilen aus einer anderen Tabelle (noch summiert sie separat). Stattdessen werden die vollständige Auswahl und die Kreuzverknüpfung angewendet. Anschließend werden Zeilen herausgefiltert, indem die Frage "Enthält diese Zeile nur Daten aus bereits ausgewählten Quellentabellenzeilen?" Wenn die Antwort ja ist, schließt sie dies von der endgültigen Auswahl aus. Wenn die ausgewählten Daten jedoch Werte aus jeder Tabelle in der Verknüpfung enthalten, ist jede Zeile bereits eindeutig und daher wird nichts ausgeschlossen.

definieren eine Summe:

SELECT Classes.ID As ID, 
     Sum(Costs.Amount) AS [Sum Of Amount] 
FROM Classes 
    LEFT JOIN Costs 
    ON Classes.[ID] = Costs.[Class ID] 
GROUP BY Classes.ID 

Dann ist die andere:

SELECT Classes.ID As ID, 
     Sum(Registrations.Tuition) AS [Sum Of Tuition] 
FROM Classes 
    LEFT JOIN Registrations ON Classes.[ID] = Registrations.[Class ID] 
GROUP BY Classes.ID 

Sie können diese Abfragen in Access speichern und dann, um sie in anderen Abfragen nach Namen verweisen, oder Sie können eingebettete SQL umfassen . In diesem Fall handelt es sich nur um persönliche Vorlieben, aber eingebettete Abfragen können nicht mit der visuellen Designansicht überprüft oder bearbeitet werden, sondern müssen mit der SQL-Ansicht in Access bearbeitet werden.

SELECT DISTINCTROW Classes.ID, Classes.Title, 
     Classes.Instructor, Classes.Date, 
     CostsAgg.[Sum Of Amount], 
     RegAggs.[Sum Of Tuition] 
FROM (Classes LEFT JOIN 
     (SELECT Classes.ID As ID, Sum(Costs.Amount) AS [Sum Of Amount] 
     FROM Classes LEFT JOIN Costs ON Classes.[ID] = Costs.[Class ID] 
     GROUP BY Classes.ID) AS CostsAgg ON Classes.ID = CostsAgg.ID) 
     LEFT JOIN 
     (SELECT Classes.ID As ID, Sum(Registrations.Tuition) AS [Sum Of Tuition] 
     FROM Classes LEFT JOIN Registrations ON Classes.[ID] = Registrations.[Class ID] 
     GROUP BY Classes.ID) AS RegAggs 
     ON Classes.ID = RegAggs.ID 
GROUP BY Classes.ID, 
     Classes.Title, 
     Classes.Instructor, 
     Classes.Date; 

Ich habe keine Count-Spalte hinzugefügt, weil es aus dem Beispiel unklar war, was Sie wirklich zu zählen versuchen.Sie können natürlich ein Count-Feld in jede der Unterabfragen oder in alle von ihnen einfügen, um unterschiedliche Werte zu erhalten.

+0

C Perkins, das hat funktioniert. Ehrlich gesagt sind diese zusammengefassten Abfragen direkt am Rande meiner Abfragefähigkeiten. Ich konnte den Code in die Details meiner Datenbank konvertieren und einen Bericht ausführen, der die beiden Summen genau vergleicht. Ich werde das für eine Weile genau studieren. Vielen Dank. –

Verwandte Themen