[SQL-Query] Frage zu Statement mit Group BY

martin

Well-Known Member
Hallo

ich mach's kurz...ich habe folgendes statement, was auch gut funktioniert:

PHP:
$query  = "SELECT rechnungen.*,SUM(rech_pos.anzahl*rech_pos.einzelpreis*(1+rech_pos.mwst_satz/100)) as Gesamt ";
$query .= "FROM `rechnungen`,`rech_pos` ";
$query .= "WHERE (rechnungen.rechnr=rech_pos.rechnr and rechnungen.jahr=rech_pos.jahr)";
$query .= "GROUP BY rechnungen.rechnr,rechnungen.jahr ";

Soweit so gut. Es werden alle Felder der Tabelle "rechnungen" ausgegeben und zusätzlich noch ein Feld "Gesamt", wo der errechnete Gesamtpreis der einzelnen Rechnungspositionen drinsteht.
Einziges Problem. Es werden nur Rechnungen ausgegeben, die auch Rechnungspositionen haben, was auch logisch ist, anhand der Abfrage, aber ich möchte, dass auch alle anderen Rechnungen angezeigt werden und dann halt als Gesamt 0 haben. Nur weiß ich nicht wie ich obige Abfrage ändern muss, damit ich zu dem gewünschten Ergebnis komme.

Danke für eure Hilfe
 
Hallo,
irgendwie stehe ich gerade etwas auf dem Schlauch, warum sollte es Rechnungen ohne Rechnungspositionen geben?

leicht verwirrte Grüsse
marmorkuchen
 
Hallo

zunächst mal danke für die Antworten.

@kamikaze
outer join wollte ich eigentlich vermeiden, damit kenne ich mich nicht aus, aber wenn's nicht anders geht, muss ich mich da einlesen.

@marmorkuchen
wenn eine neue Rechnung angelegt wird, gibt es zunächst noch keine Positionen. Auch diese neu erstellten Rechnungen sollen in der Gesamtliste aufscheinen, um sie bearbeiten zu können, falls mal unmittelbar nach dem erstellen einer neuen Rechnung etwas schief gegangen ist.
 
so jetzt bin ich nochmal lästig... habe mir jetzt die joins etwas angeschaut und folgendes probiert:

PHP:
 SELECT rechnungen . * , SUM( rech_pos.anzahl * rech_pos.einzelpreis * ( 1 + rech_pos.mwst_satz /100 ) ) AS Gesamt
FROM `rechnungen`
LEFT JOIN rech_pos
USING ( rechnr, jahr )
GROUP BY rech_pos.rechnr

Leider mit dem selben Ergebnis wie vorher. Rechnungen, die keinen Eintrag in rech_pos haben, werden nicht aufgelistet! :confused:
 
Hallo,
Kamikaze hat recht, hier kommst Du ohne OUTER JOIN kaum weiter:
Mit einem Left Join wird eine sogenannte linke Inklusionsverknüpfung erstellen. Linke Inklusionsverknüpfungen schließen alle Datensätze aus der ersten (linken) Tabelle ein, auch wenn keine entsprechenden Werte für Datensätze in der zweiten Tabelle existiert.
Link
Alternativ geht auch der (+) Operator, wird aber wegen der schlechten Lesbarkeit von vielen als schlechter Stil angesehen.

@marmorkuchen
wenn eine neue Rechnung angelegt wird, gibt es zunächst noch keine Positionen. Auch diese neu erstellten Rechnungen sollen in der Gesamtliste aufscheinen, um sie bearbeiten zu können, falls mal unmittelbar nach dem erstellen einer neuen Rechnung etwas schief gegangen ist.

So was sollte eigentlich in einer Transaktion abgehandelt werden, die alles zurückrollt, wenn es einen Fehler gegeben hat. Von hier aus kommst Du bestimmt weiter.

Deine Tabellenstruktur wär bei weiteren Fragen durchaus hilfreich.
 
Ahhh ich bin so ein Esel...meine Anweisung mit dem Join funktioniert natürlich, habe nur bei GROUP BY die falsche Tabelle hingeschrieben, mit rechnungen.rechnr statt rech_pos.rechnr geht's!

Danke an alle!
 
Zurück
Oben