Fehler: Mehrfache Summierung eines Wertes in einem Join

Fehler: Mehrfache Summierung eines Wertes in einem Join

am 26.03.2006 17:17:50 von Stephan

Hallo, hier ist mein Problem nochmal kurz und knackig beschrieben.

Ich habe zwei Tabellen, es werden Autoren und deren Bücher
gespeichert.

CREATE TABLE autoren(
ID INT NOT NULL AUTO_INCREMENT,
name CHAR(15) NOT NULL,
ort CHAR(10) NOT NULL,
einkommen INT NOT NULL,
PRIMARY KEY (ID));

CREATE TABLE buch(
ID INT NOT NULL AUTO_INCREMENT,
titel CHAR(15) NOT NULL,
autorID INT NOT NULL,
seiten SMALLINT,
PRIMARY KEY (ID));

Zu jedem Autor können beliebig viele Bücher abgespeichert werden.
Nun möchte ich eine Liste haben, die (nach Orten zusammengefasst)
zeigt, aus welchem Ort wieviele Autoren wieviele Seiten geschrieben
und welches EInkommen haben.

SELECT autoren.ort, COUNT(DISTINCT autoren.ID), COUNT(DISTINCT
buch.ID), SUM(buch.seiten), SUM(autoren.einkommen)
FROM autoren
LEFT JOIN buch ON autoren.ID =3D buch.autorID
GROUP BY autoren.ort

Diese Abfrage gibt (in der Summe der Einkommen) ein falsches Ergebnis
zurück, da für jeden buch-Datensatz, der im Join zurückgeliefert
wird,
auch der entsprechende Autor immer wieder angezeigt wird. Daher wird
hier jedesmal das Einkommen in die Summe eingefügt. Also: Das
Einkommen
ist so oft in der Summe, die es zum bereffenden Autor Bücher gibt.

Re: Fehler: Mehrfache Summierung eines Wertes in einem Join

am 26.03.2006 18:02:36 von Kai Ruhnau

Stephan wrote:
> CREATE TABLE autoren(
> ID INT NOT NULL AUTO_INCREMENT,
> name CHAR(15) NOT NULL,
> ort CHAR(10) NOT NULL,
> einkommen INT NOT NULL,
> PRIMARY KEY (ID));
>
> CREATE TABLE buch(
> ID INT NOT NULL AUTO_INCREMENT,
> titel CHAR(15) NOT NULL,
> autorID INT NOT NULL,
> seiten SMALLINT,
> PRIMARY KEY (ID));
>
> Zu jedem Autor können beliebig viele Bücher abgespeichert werden.
> Nun möchte ich eine Liste haben, die (nach Orten zusammengefasst)
> zeigt, aus welchem Ort wieviele Autoren wieviele Seiten geschrieben
> und welches EInkommen haben.
>
> SELECT autoren.ort, COUNT(DISTINCT autoren.ID), COUNT(DISTINCT
> buch.ID), SUM(buch.seiten), SUM(autoren.einkommen)
> FROM autoren
> LEFT JOIN buch ON autoren.ID = buch.autorID
> GROUP BY autoren.ort
>
> Diese Abfrage gibt (in der Summe der Einkommen) ein falsches Ergebnis
> zurück, da für jeden buch-Datensatz, der im Join zurückgeliefert
> wird,
> auch der entsprechende Autor immer wieder angezeigt wird. Daher wird
> hier jedesmal das Einkommen in die Summe eingefügt. Also: Das
> Einkommen
> ist so oft in der Summe, die es zum bereffenden Autor Bücher gibt.
>

Folgendes sollte funktionieren (ungetestet):

SELECT sum_autoren.ort, sum_autoren.anzahl, sum_autoren.einkommen,
sum_buch.anzahl, sum_buch.seiten
FROM (
SELECT ort AS ort, COUNT(*) AS anzahl, SUM(einkommen) AS einkommen
FROM autoren
GROUP BY ort
) AS sum_autoren
INNER JOIN (
SELECT autoren.ort AS ort, COUNT(*) AS anzahl, SUM(buch.seiten) AS
seiten
FROM buch
INNER JOIN autoren ON autoren.ID=buch.autorID
GROUP BY autoren.ort
) AS sum_buch
WHERE sum_buch.ort=sum_autoren.ort


Grüße
Kai

--
This signature is left as an exercise for the reader.

Re: Fehler: Mehrfache Summierung eines Wertes in einem Join

am 27.03.2006 07:53:12 von Stephan

Danke schonmal, sieht vielversprechend aus, ich kannst erst Freitag
testen.

Grüße
Stephan

Re: Fehler: Mehrfache Summierung eines Wertes in einem Join

am 31.03.2006 18:49:44 von Stephan

Vielen Dank, durch dieses Beispiel habe ich die Lösung gefunden. Es
ist zwar wahnsinnig langsam, aber es läuft. Schade dass es da keine
Funktion nach dem Muster von DISTINCT gibt.