Group By Problem über mehrere Tabellen

mail2mrx

Mitglied
Hallo zusammen,
ich habe ein Problem mit einer Group By Abfrage in MySQL und ich komme einfach nicht weiter.
Folgende Situation:
Tabelle 1 (Stunden) mit Feldern Baumassnahme, & Stunden
Tabelle 2 (Baumassnahme) mi Feldern Baumassnahmen_id, Beschreibung etc...
Tabelle 3 (Rechnungen) Rechnungsid, Baumassnahme, etc.
Tabelle 4 (rechnungspositionen) Rechnungsid, betrag

Die Gesamtsumme der Stunden kann ich wie folgt abrufen:
Code:
SELECT b.bm_nummer, b.baumassnahme, SUM( s.stunden ) 
FROM kst_stunden s, kst_baumassnahmen b
WHERE b.BM_ID = s.BAUMASSNAHME
GROUP BY BAUMASSNAHME
ORDER BY `bm_nummer` ASC
Den Gesamtbetrag rufe ich mit
Code:
SELECT b.bm_nummer, b.baumassnahme, SUM( s.stunden ) , SUM( pos.betrag ) 
FROM kst_stunden s, kst_baumassnahmen b, kst_rech_pos pos, kst_rechnungen r
WHERE b.BM_ID = s.BAUMASSNAHME AND b.BM_ID = r.BAUMASSNAHME AND r.R_ID = pos.R_ID
GROUP BY BAUMASSNAHME
ORDER BY `bm_nummer` ASC
ab. Soweit so gut.
Jetzt zu meinem Problem, wenn ich versuche, beide Abfragen in einer zu machen, bekomme ich falsche Werte...
Ich bin für jeden Lösungsansatz dankbar...

Danke & Gruß

Alex
 
hm,
ich komme leider noch immer nicht weiter.
Ich habe es jetzt mit dieser Abfrage gelöst, allerdings ist das wohl nur eine Notlösung, da sie zu viel rechenpower verschlingt...

Ich habe herausgefunden, dass er die Summe der Rechnungen mit jeder verknüpften Stunde multipliziert, da er das natürlich nicht soll, teile ich das Ergebnis wieder.
Code:
SELECT DISTINCT * , b.bm_nummer, b.baumassnahme, SUM( s.stunden ) AS summe_stunden, 
(
SUM( pos.betrag ) / count( ST_ID ) 
) AS summe_betrag
FROM kst_stunden s, kst_baumassnahmen b, kst_kostenstellen k
LEFT JOIN kst_rechnungen AS r ON b.BM_ID = r.BAUMASSNAHME
LEFT JOIN kst_rech_pos AS pos ON r.R_ID = pos.R_ID
WHERE b.BM_ID = s.BAUMASSNAHME AND b.KOSTENSTELLE = k.KST_ID
GROUP BY r.BAUMASSNAHME
ORDER BY BM_ID ASC  LIMIT 0 , 50

Ich wäre wirklich für hilfreiche Tipps dankbar. Wenn ihr mein Problem gar nicht erst versteht weil ich es zu kompliziert erkläre, meldet euch und ich versuche es zu erläutern...

Gruß Alex
 
Normalerweise müssen bei Funktionen in der GROUP BY -Anweisung alle ausgegebenen Felderangegeben werden, die keine Funktion enthalten, sprich b.baumassnahme und b.bm_nummer
Das distinct hattest du hier nicht konsequent genug gemacht.
Außerdem solltest du bei Spaltennamen, die in mehreren Tabellen vorkommen, immer die betreffende Tabelle davor schreiben.
 
Zuletzt bearbeitet:
ja, es könnte auch kongruent, also deckungsgleich sein. Es geht mir hierbei auch nicht darum, auf evt. Tippfehlern von Gorcky einzugehen, sondern vielmehr auf ein beispiel, was er mit kongruenter bzw. konsequenter Abfrage meinte.

Ich bekomme nämlich noch immer einen Fehler, wenn ich distinct in die SUM Klammern packe, auch wenn ich alle anderen Werte in die group by Klausel schreibe, wie von Gorcky vorgeschlagen.

Gruß Alex
 
Was ich meinte, war, dass du das hier rot eingefügte DISTINCT nicht drin stehen hattest.

SELECT b.bm_nummer, b.baumassnahme, SUM( DISTINCT (s.stunden) ) AS summe_stunden,
SUM( DISTINCT(pos.betrag) ) AS summe_betrag
FROM kst_stunden s, kst_baumassnahmen b, kst_rech_pos pos, kst_rechnungen r
WHERE b.BM_ID = s.BAUMASSNAHME AND b.BM_ID = r.BAUMASSNAHME AND r.R_ID = pos.R_ID
GROUP BY b.bm_nummer, b.baumassnahme
ORDER BY b.bm_nummer ASC

Mich würde wundern, wenn es so nicht klappt...

*edit* Da DISTINCT keine Funktion im Sinne von z.B. SUM() ist, solltest du die Klammern um die Spalten weglassen (können).
 
Zuletzt bearbeitet:
Ich habe deinen Befehl komplett überneoomen, habe allerdings den gleichen Fehler wie vorher:

Code:
SQL-Befehl :  

SELECT b.bm_nummer, b.baumassnahme, SUM( DISTINCT (

s.stunden
) ) AS summe_stunden, SUM( DISTINCT (
pos.betrag
) ) AS summe_betrag
FROM kst_stunden s, kst_baumassnahmen b, kst_rech_pos pos, kst_rechnungen r
WHERE b.BM_ID = s.BAUMASSNAHME AND b.BM_ID = r.BAUMASSNAHME AND r.R_ID = pos.R_ID
GROUP BY b.bm_nummer, b.baumassnahme
ORDER BY b.bm_nummer ASC 
LIMIT 0 , 50 

MySQL meldet: 


#1064 - You have an error in your SQL syntax near 'DISTINCT ( s.stunden ) )  AS summe_stunden, SUM(  DISTINCT ( pos.betrag ) )  AS ' at line 1

Bist du dir sicher, dass es einen Distinct im Sum() gibt? Ich habe bei mysql.de http://dev.mysql.com/doc/mysql/de/Group_by_functions.html nichts darüber gefunden...

Gruß Alex
 
Dann versuch es bitte noch einmal ohne Klammern.
Distinct hat übrigens nichts mit Sum() zu tun, aber Normalerweise kann man Befehle "beliebig" verschachteln...
Code:
SELECT b.bm_nummer, b.baumassnahme, SUM( DISTINCT s.stunden) AS summe_stunden, SUM( DISTINCT pos.betrag ) AS summe_betrag
 
Ich bekomme noch immer den gleiche Fehler:
Code:
Fehler

SQL-Befehl :  

SELECT b.bm_nummer, b.baumassnahme, SUM( DISTINCT s.stunden ) AS summe_stunden, SUM( DISTINCT pos.betrag ) AS summe_betrag
FROM kst_stunden s, kst_baumassnahmen b, kst_rech_pos pos, kst_rechnungen r
WHERE b.BM_ID = s.BAUMASSNAHME AND b.BM_ID = r.BAUMASSNAHME AND r.R_ID = pos.R_ID
GROUP BY b.bm_nummer, b.baumassnahme
ORDER BY b.bm_nummer ASC 
LIMIT 0 , 50 

MySQL meldet: 


#1064 - You have an error in your SQL syntax near 'DISTINCT s.stunden )  AS summe_stunden, SUM(  DISTINCT pos.betrag )  AS summe_be' at line 1

ich bin irgendwie ratlos...

Danke trotzdem

Gruß Alex
 
Zurück