# Group By Problem über mehrere Tabellen



## mail2mrx (15. Juni 2004)

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:

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

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


----------



## mail2mrx (17. Juni 2004)

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. 

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


----------



## Gorcky (17. Juni 2004)

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.


----------



## mail2mrx (17. Juni 2004)

was ist denn konskuent?

kannst du mir dafür ein beispiel nennen?


----------



## jenno (17. Juni 2004)

Aus dem Textinhalt ergibt sich mir:

konskuent = konsequent


----------



## mail2mrx (17. Juni 2004)

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


----------



## Gorcky (17. Juni 2004)

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


----------



## mail2mrx (17. Juni 2004)

Ich habe deinen Befehl komplett überneoomen, habe allerdings den gleichen Fehler wie vorher:


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


----------



## Gorcky (17. Juni 2004)

Dann versuch es bitte noch einmal ohne Klammern.
Distinct hat übrigens nichts mit Sum() zu tun, aber Normalerweise kann man Befehle "beliebig" verschachteln...

```
SELECT b.bm_nummer, b.baumassnahme, SUM( DISTINCT s.stunden) AS summe_stunden, SUM( DISTINCT pos.betrag ) AS summe_betrag
```


----------



## mail2mrx (18. Juni 2004)

Ich bekomme noch immer den gleiche Fehler:

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


----------



## Movera (18. Juni 2004)

Hi,


leider bin ich kein Fachmann für MySQL, trotzdem will ich meinen Senf mal dazugeben:

Wie in allen Programmiersprachen würde ich jetzt versuchen, den Fehler einzugrenzen. Dazu würde ich die Abfrage ganz klein beginnen und nach und nach erweitern, bis das gewünschte Ergebnis erreicht ist:

Versuche doch mal folgendes:

select sum(distinct stunden)
from kst_stunden;

Wenn Du hierfür keine Fehlermeldung bekommst versuche den ersten Join usw....


----------



## mail2mrx (18. Juni 2004)

Danke, die Idee war gar nicht mal so schlecht. Zumindest kann ich sicher sein, dass das Sum(Distinct xy) nicht funktioniert...


```
SELECT sum( DISTINCT stunden ) 
FROM kst_stunden 

MySQL meldet: 


#1064 - You have an error in your SQL syntax near 'DISTINCT stunden ) 
FROM kst_stunden' at line 1
```

Schade, da es hier als funktionierend beschrieben wurde, dachte ich es geht doch... (Vgl. 
link )

Danke und Gruß Alex

P.S. Mir ist klar, dass ich das ganze normalerweise mit nem Group By kombinieren muss, aber bis zu diesem Fehler kommt es ja erst gar nicht...


----------



## jenno (18. Juni 2004)

Tja, der Punkt ist, SUM(DISTINCT irgendwas) funktioniert vielleicht bei irgendwelchen Datenbanken.  Aber eben nicht bei mysql.

Und deswegen wird es ganz bestimmt nen anderen Weg nach Rom geben.

Gib mal n einfaches Beispiel zum Nachbauen der Datenbank mit n paar Beispieldatensätzen...


----------



## Movera (18. Juni 2004)

> _Original geschrieben von mail2mrx _
> *Danke, die Idee war gar nicht mal so schlecht. Zumindest kann ich sicher sein, dass das Sum(Distinct xy) nicht funktioniert...
> 
> *
> ...



Naja, wenigstens weißt Du jetzt, wonach Du suchen mußt. Datenbank ist wohl doch nicht Datenbank, mit Oracle würde es gehen.


----------

