Summe ist falsch weil mehrere Tabellen verknüpft sind
Summe ist falsch weil mehrere Tabellen verknüpft sind
am 24.03.2006 14:19:07 von Stephan
Hallo,
Ich habe ein Problem mit einer MySQL SELECT-Anweisung.
Ich habe drei verbundene Tabellen: A, B and C
Ein Datensatz aus A cann in B beliebig viele zugeordnete Datensätze
haben
Ein Datensatz aus A cann in B beliebig viele zugeordnete Datensätze
haben
Zum Beispiel (erfunden):
Diese Tabellenstruktur ist nur während eines Jahres benutzt und
speichert Infos
zu Sängern, Konzerten und Gästen.
A =3D TABELLE Saenger
B =3D TABELLE Konzert
C =3D TABELLE Besucher (der Konzerte)
Wir haben 3 Sänger, jeder von Ihnen hatte ein paar Konzerte und bei
jedem
Konzert gab es mehrere Besucher.
Tabelle A hat ein Feld "benoetigtes_Geld". Hier wird gespeichert,
wieviel Geld
der Sänger in einem Jahr verdienen muss/will.
Tabelle C hat ein Feld "bezahlt", in dem steht, wievieil jeder Besucher
in dem jeweiligen Konzert bezahlte.
Nun die SELECT Anweisung:
SELECT A.saengerland, SUM(A.benoetigtes_geld) as geld, SUM(C.bezahlt)
as einkommen
FROM A
LEFT JOIN B ON A.ID =3D B.saengerID
LEFT JOIN C ON B.ID =3D C.konzertID
GROUP BY A.saengerland
Ich möchte eine iste aller Länder haben, den benötigten Betrag der
Sänger dieses
Landes und das Geld, was in diesen Konzerten reingekommen ist.
Das Problem ist, dass es zu A mehrere B und dazu mehrere C gibt, also
jeder Datensatz aus A mehrfach angezeigt wird. MySQL summiert dann für
jede Anzeige desselben Datensatzes aus A auch dieren benötigtes Geld,
obwohl dies nur einmal in die Summe hineingenommen werden soll.
Kennt jemand die Lösung?
Re: Summe ist falsch weil mehrere Tabellen verknüpftsind
am 24.03.2006 17:40:25 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Summe ist falsch weil mehrere Tabellen verknüpft sind
am 24.03.2006 18:19:41 von Stephan
ja, kennt jemand:
1. Dies sind die beteiligten Tabellen:
CREATE TABLE buchung(
ID INT NOT NULL AUTO_INCREMENT,
belegdatum DATE NOT NULL,
betragbrutto DECIMAL(9,2) NOT NULL,
kredebversoID INT,
PRIMARY KEY (ID),
INDEX index5buchungsposition (kredebversoID));
CREATE TABLE buchungsposition(
ID INT NOT NULL AUTO_INCREMENT,
bes CHAR(100) DEFAULT '-' NOT NULL,
betragnetto DECIMAL(9,2) NOT NULL,
buchungID INT NOT NULL,
PRIMARY KEY (ID),
INDEX index2buchungsposition (buchungID));
CREATE TABLE buchungsausgleich(
ID INT NOT NULL AUTO_INCREMENT,
buchungspositionID INT NOT NULL,
ueberwiesenam DATE,
bezahltam DATE,
betrag DECIMAL(9,2) NOT NULL,
PRIMARY KEY (ID),
INDEX index2buchungsausgleich (buchungspositionID));
CREATE TABLE versorger(
ID INT NOT NULL AUTO_INCREMENT,
bez CHAR(40) NOT NULL,
PRIMARY KEY (ID),
UNIQUE UC_bez (bez));
2. Hier die Abfrage, die buchung.betragbrutto doppelt und dreifach
summiert:
SELECT versorger.ID, versorger.bez, SUM(buchung.betragbrutto),
COUNT(buchung.ID), SUM(b1.betrag)
FROM versorger
LEFT JOIN buchung ON versorger.ID = buchung.kredebversoID
LEFT JOIN buchungsposition ON buchung.ID = buchungsposition.buchungID
LEFT JOIN buchungsausgleich AS b1 ON buchungsposition.ID =
b1.buchungspositionID
AND (b1.bezahltam IS NOT NULL) AND (b1.bezahltam <> '0000-00-00') AND
(b1.bezahltam <> '')
Re: Summe ist falsch weil mehrere Tabellen verknüpftsind
am 25.03.2006 12:08:08 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Summe ist falsch weil mehrere Tabellen verknüpft sind
am 25.03.2006 15:43:24 von Stephan
> Du könntest buchung.betragbrutto weglassen und
in Deinem Select statt SUM(buchung.betragbrutto)
> besser buchungsposition.betragnetto verwenden.
ja, aber das löst das Problem nicht, denn die Positionen haben ja
wiederum beliebig viele Ausgleichsdatensätze, so dass also dann wieder
die Buchungen der Positionen zu viel aufsummiert werden.
Mit der referenziellen Integrität hast Du recht, dies wird nicht auf
Tabellenebene, sondern durch das Frontend sichergestellt.
Das kann doch nicht sein, dass ich der einizige bin, der ein so
elementares Problem hat: Bei verknüpften Tabellen kann man keine Summe
eines Feldes der Primärtabelle darstellen?
Re: Summe ist falsch weil mehrere Tabellen verknüpftsind
am 25.03.2006 16:36:05 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Summe ist falsch weil mehrere Tabellen verknüpft sind
am 26.03.2006 17:14:26 von Stephan
Den Ansatz mit dem Subselct hatte ich auch schon erwogen aber wegen der
Langsamkeit der Ausführung nicht so umgesetzt. Bie Deinem Beispiel ist
die
Summe (wie Du schon vermutet hast) ebenfalls falsch, wel ja mehrere DS
im
Buchungsausgleich wieder für eine doppelte Aufsummierung sorgen.
Ich habe wohl durch meine langen Beispiele das Problem verkompliziert
und werde es nochmal kurz und knackig beschreiben und neu einstellen.
Danke bis hierher erstmal.