Anmelden

View Full Version : SQL Summen aus mehreren Tabellen mit unterschiedlicher Satzanzahl



mgraskamp
23-02-18, 09:59
Ich möchte aus 2 verschiedenen Dateien jeweils Summen bekommen, unabhängig wieviele Sätze mit gleichem Schlüssel in den jeweiligen Dateien stehen

Tabelle1:
Nummer, Position, Sollkosten

Tabelle2:
Nummer, Position, Istkosten

Tabelle1 ist immer mind. mit einem Satz gefüllt. Tabelle2 kann 0 bis N Sätze haben.

select tabelle1.nummer, sum(sollkosten), sum(istkosten)
from tabelle1 left join tabelle2 on tabelle1.nummer=tabelle2.nummer

Problem: Wenn in Tabelle1 ein Satz steht und in Tabelle2 zwei Sätze, dann wird die Summe aus Tabelle1 verdoppelt. Wie kann ich das vermeiden?

Danke & Gruß

Robi
23-02-18, 10:34
With a as (select nr, pos, sum(istkosten) from tab2 group by nummer)
select tabelle1.nummer, sum(sollkosten), sum(istkosten)
from tabelle1 left join a on tabelle1.nummer=a.nummer

Fuerchau
23-02-18, 10:37
Da hättest du eigentlich einen Fehler bekommen müssen, da der Group By einfach fehlt:

select tabelle1.nummer, sum(sollkosten), sum(istkosten)
from tabelle1 left join tabelle2 on tabelle1.nummer=tabelle2.nummer
group by tabelle1.nummer

mgraskamp
23-02-18, 10:50
Danke für die Hilfe. Ich hatte tatsächlich das GOUP BY in meinem Beitrag vergessen. Im Original hatte ich es natürlich drin. Die Lösung ist, dass ich die Istkosten vorher in der WITH Anweisung gruppiere. Korrekt lautet das Statement:
With a as (select nr, sum(istkosten) as istkosten
from tabelle2 group by tabelle2.nr)
select tabelle1.nr, sum(sollkosten), sum(istkosten)
from tabelle1 left join a on tabelle1.nr=a.nr
group by tabelle1.nr

DANKE Euch! :-)

Fuerchau
23-02-18, 11:51
Das Problem besteht nicht in der obigen Aussage:

"Problem: Wenn in Tabelle1 ein Satz steht und in Tabelle2 zwei Sätze, dann wird die Summe aus Tabelle1 verdoppelt."

Hier kann es keine "Verdoppelung" kommen, da dies ja die Regel ist, wenn ich 1 Kopf und n Positionen habe (1:N-Beziehung).
Dein Problem tritt dann auf, wenn in Tabelle 1 mehr als 1 Satz vorhanden ist. Dann tritt eben die Vervielfältigung ein und erzwingt eben ein getrenntes "Vorverdichten" von Tabelle 1 und 2, was eben einer N:M-Beziehung entspricht.

Pikachu
23-02-18, 13:19
Naja, wenn man zu jeder der n Positionen den Kopf ermittelt, kann man leicht auf n Köpfe kommen...

Fuerchau
23-02-18, 16:08
Dann hast du die Tabellen verdreht und eine N:1-Beziehung definiert;-).
Deshalb gibt es ja auch noch den "Right [outer] Join", der das dann wieder gerade biegt.

Pikachu
26-02-18, 12:52
Wenn man per SQL mit einem SELECT zu einem (1) Kopf seine (N) Positionen dazuliest, sollte man in diesem SELECT besser nicht die Beträge dieses Kopfs aufsummieren...

Fuerchau
27-02-18, 08:41
Stimmt, da könnte man MIN/MAX verwenden.