Forums Neueste Beiträge
 

Mehrere Joins - falsche Ergebnisse in Aggregatfunktionen

14/05/2008 - 10:39 von Tim Konnst | Report spam
Hallo NG,

ich habe Eine Abfrage über 3 Tabellen. Dabei sollen mir immer Werte (zum
Beispiel Summen der einzelnen Kostenpositionen) zu den Kostengruppen
ausgegeben werden. Dabei Interessiert noch die Summe der Benchwerts innerhalb
der Kostengruppen die allerdings in einer Weiteren Tabelle gespeichert sind,
da diese von mehreren Projekten benutzt werden.

Wenn ich nun Abfrage Nummer 1 mache wird mir die richtige Summe der
Benchwerte passend zur Kostengruppe ausgegeben:

SELECT KG1er.Name, KG1er.Bemerkung, SUM(Benchwerte.Benchwert) AS
BenchwertSumme
FROM KG1er
LEFT JOIN Benchwerte ON (KG1er.ID = Benchwerte.KG1erID)
GROUP BY KG1er.Name,KG1er.Bemerkung
ORDER BY KG1er.Name;

Bei Abfrage Nummer 2 mache werden mir die richtigen Summen der Kosten
passend zur Kostengruppe ausgegeben:

SELECT KG1er.Name, KG1er.Bemerkung, SUM(EinrichtungsbedUmfGp/@Flaeche) AS
EinrichtungsbedUmfEp, SUM(EinrichtungsbedUmfGp) AS EinrichtungsbedUmfGp
FROM KG1er
LEFT JOIN KostenschaetzungQm ON (KG1er.ID = KostenschaetzungQm.KG1erID)
GROUP BY KG1er.Name,KG1er.Bemerkung
ORDER BY KG1er.Name;

Will ich diese nun zusammen in eine Tabelle bringen werden die Summenwerte
verdreifacht. Sprich wenn ich bisher Die Benchwertsumme 20 hatte kommt nun 60
heraus. Hier die Abfrage:

SELECT KG1er.Name, KG1er.Bemerkung, SUM(ALL Benchwerte.Benchwert) AS
BenchwertSumme, SUM(EinrichtungsbedUmfGp/@Flaeche) AS [EinrichtungsbedUmfEp],
SUM(EinrichtungsbedUmfGp) AS [EinrichtungsbedUmfGp]
FROM KG1er
LEFT JOIN Benchwerte ON (KG1er.ID = Benchwerte.KG1erID)
LEFT JOIN KostenschaetzungQm ON (KG1er.ID = KostenschaetzungQm.KG1erID)
GROUP BY KG1er.Name,KG1er.Bemerkung
ORDER BY KG1er.Name;

Sobald ich den den unteren Left Join weglasse werden wieder die richtigen
Summen angezeigt.

Hat dazu jemand eine Idee? Ich weiß hier nicht mehr weiter... Alle Variablen
sind richtig definiert und wie gesagt funktioniert das einzeln auch alles
Prima. Ich habe das Gefühl das ich irgendwas übersehen habe.

Danke!!!

Grüße Tim
 

Lesen sie die antworten

#1 Christoph Ingenhaag
14/05/2008 - 13:59 | Warnen spam
"Tim Konnst" wrote:

Hallo NG,

ich habe Eine Abfrage über 3 Tabellen. Dabei sollen mir immer Werte (zum
Beispiel Summen der einzelnen Kostenpositionen) zu den Kostengruppen
ausgegeben werden. Dabei Interessiert noch die Summe der Benchwerts innerhalb
der Kostengruppen die allerdings in einer Weiteren Tabelle gespeichert sind,
da diese von mehreren Projekten benutzt werden.

Wenn ich nun Abfrage Nummer 1 mache wird mir die richtige Summe der
Benchwerte passend zur Kostengruppe ausgegeben:

SELECT KG1er.Name, KG1er.Bemerkung, SUM(Benchwerte.Benchwert) AS
BenchwertSumme
FROM KG1er
LEFT JOIN Benchwerte ON (KG1er.ID = Benchwerte.KG1erID)
GROUP BY KG1er.Name,KG1er.Bemerkung
ORDER BY KG1er.Name;

Bei Abfrage Nummer 2 mache werden mir die richtigen Summen der Kosten
passend zur Kostengruppe ausgegeben:

SELECT KG1er.Name, KG1er.Bemerkung, SUM(EinrichtungsbedUmfGp/@Flaeche) AS
EinrichtungsbedUmfEp, SUM(EinrichtungsbedUmfGp) AS EinrichtungsbedUmfGp
FROM KG1er
LEFT JOIN KostenschaetzungQm ON (KG1er.ID = KostenschaetzungQm.KG1erID)
GROUP BY KG1er.Name,KG1er.Bemerkung
ORDER BY KG1er.Name;

Will ich diese nun zusammen in eine Tabelle bringen werden die Summenwerte
verdreifacht. Sprich wenn ich bisher Die Benchwertsumme 20 hatte kommt nun 60
heraus. Hier die Abfrage:

SELECT KG1er.Name, KG1er.Bemerkung, SUM(ALL Benchwerte.Benchwert) AS
BenchwertSumme, SUM(EinrichtungsbedUmfGp/@Flaeche) AS [EinrichtungsbedUmfEp],
SUM(EinrichtungsbedUmfGp) AS [EinrichtungsbedUmfGp]
FROM KG1er
LEFT JOIN Benchwerte ON (KG1er.ID = Benchwerte.KG1erID)
LEFT JOIN KostenschaetzungQm ON (KG1er.ID = KostenschaetzungQm.KG1erID)
GROUP BY KG1er.Name,KG1er.Bemerkung
ORDER BY KG1er.Name;

Sobald ich den den unteren Left Join weglasse werden wieder die richtigen
Summen angezeigt.

Hat dazu jemand eine Idee? Ich weiß hier nicht mehr weiter... Alle Variablen
sind richtig definiert und wie gesagt funktioniert das einzeln auch alles
Prima. Ich habe das Gefühl das ich irgendwas übersehen habe.

Danke!!!

Grüße Tim



Hi Tim,

du hast übersehen, dass durch die Joins die Ergebnisse nochmal kombiniert
und dann erst summiert werden. Es werden durch dein Statement keine
Ziwschenergebnisse gebildet, die dann wieder verknüpft werden.
Um das zu erreichen, musst du diese Zwischenergebnisse erzwingen. Ein Weg
ist mit derived tables zu arbeiten oder mit cte (ab 2005) oder mit temporàren
Tabellen.

Ich hab mal auf die Schnelle ein Beispiel mit derived tables gemacht (copy &
paste ;-) )

declare @KG1er table
(
ID int
,Name varchar(30)
,Bemerkung varchar(30)
)

declare @KostenschaetzungQm table
(
KG1erID int
,EinrichtungsbedUmfGp int
)

declare @Benchwerte table
(
KG1erID int
,Benchwert int
)


insert into @KG1er
select 1, 'A', 'BemA' union all
select 2, 'B', 'BemB' union all
select 3, 'C', 'BemC' union all
select 4, 'D', 'BemD' union all
select 5, 'E', 'BemE'

insert into @KostenschaetzungQm
select 1, 10 union all
select 1, 20 union all
select 2, 20 union all
select 2, 30 union all
select 3, 30 union all
select 3, 40 union all
select 4, 40 union all
select 4, 50 union all
select 5, 50 union all
select 5, 60

insert into @Benchwerte
select 1, 10 union all
select 1, 20 union all
select 2, 20 union all
select 2, 30 union all
select 3, 30 union all
select 3, 40 union all
select 4, 40 union all
select 4, 50 union all
select 5, 50 union all
select 5, 60



SELECT KG1er.Name, KG1er.Bemerkung, SUM(ALL B.BenchwertSumme) AS
BenchwertSumme, SUM(K.EinrichtungsbedUmfGp/2) AS [EinrichtungsbedUmfEp],
SUM(K.EinrichtungsbedUmfGp) AS [EinrichtungsbedUmfGp]
FROM @KG1er KG1er
left join
(
SELECT SUM(Benchwerte.Benchwert) AS
BenchwertSumme, KG1er.ID
FROM @KG1er KG1er
LEFT JOIN @Benchwerte Benchwerte ON (KG1er.ID = Benchwerte.KG1erID)
GROUP BY KG1er.ID
) B
on
B.ID = KG1er.ID
left join
(
SELECT SUM(EinrichtungsbedUmfGp/2) AS
EinrichtungsbedUmfEp, SUM(EinrichtungsbedUmfGp) AS EinrichtungsbedUmfGp,
KG1er.ID
FROM @KG1er KG1er
LEFT JOIN @KostenschaetzungQm KostenschaetzungQm ON (KG1er.ID =
KostenschaetzungQm.KG1erID)
GROUP BY KG1er.ID
) K
on
B.ID = K.ID
GROUP BY KG1er.Name,KG1er.Bemerkung

Vielleicht hat ja jemand anderes Zeit und Lust auf eine elegante Lösung,
dies dient nur dazu, dich auf den "richtigen Weg" zu bringen...

Vg
Christoph

Ähnliche fragen