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 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.