[MySQL] Tabellen verknüpfen mit Berechnung

Zero2000

Erfahrenes Mitglied
Hallo

laut suche gibt es ja zu "Tabellen verknüpfen" jede Menge Treffer wovon ich mir die meisten auch angesehen habe und ein bisschen probiert, aber leider ist nichts konkretes zu meinem "Problem" dabei.

Ich habe 2 Tabellen wareneingang und warenausgang, beide sind vom Aufbau her gleich:
id, id_kunde, id_artikel, id_warenart, datum, anzahl
Nun möchte ich das Wareneingänge die dem selben Kunden mit selbem Artikel und selber Warenart bei der Ausgabe zusammengezählt werden. So kann ich dann analog zu den Warenausgängen den Bestand errechnen lassen.
Das ganze realisiere ich mit PHP.

Leider bekomme ich das nicht so recht hin. Laut meinem Code bekomme ich immer alle Wareneingänge zu allen Warenausgängen gegenübergestellt. das passt nicht vorne und nicht hinten.

Hier mal mein Code:
HTML:
SELECT we.id_kunde, we.id_artikel, we.id_warenart, we.datum AS ein_datum, we.anzahl AS ein_anzahl, wa.id_kunde, wa.id_artikel, wa.id_warenart, wa.datum AS aus_datum, wa.anzahl AS aus_anzahl FROM wareneingang AS we LEFT JOIN warenausgang AS wa ON we.id_artikel = wa.id_artikel WHERE we.id_kunde = $kunde

Kann mir da jemand einen Tip geben der mich auf den richtigen Weg bringt?

LG
Maik
 
Hallo

ohne JOIN klappt das schonmal genauso wie ich es mir vorstelle für die Tabelle wareneingang.
Code:
SELECT id_kunde, id_artikel, id_warenart, datum, SUM(anzahl) AS ein_anzahl FROM wareneingang WHERE id_kunde = $kunde GROUP BY id_kunde, id_artikel, id_warenart
Aber wie bekomme ich nun das äquivalent der Tabelle warenausgang?
Wenn ich eine 2. Abfrage erstelle kennt er ja nicht die Beziehung zwischen den beiden Tabellen.

Wär schön wenn hier einer helfen könnte.

LG
Maik
 
Als allererstes muss man das QUery mal in eine Lesbare Form quetschen. Einzeiler sind nur bei sehr kleinen Querystrings lesbar.
SQL:
SELECT 
	we.id_kunde,
	we.id_artikel,
	we.id_warenart,
	we.datum AS ein_datum,
	we.anzahl AS ein_anzahl,
	wa.id_kunde,
	wa.id_artikel,
	wa.id_warenart,
	wa.datum AS aus_datum,
	wa.anzahl AS aus_anzahl
FROM 
	wareneingang AS we 
	LEFT JOIN warenausgang AS wa 
		ON we.id_artikel = wa.id_artikel
WHERE
	we.id_kunde = $kunde
Jetzt sehen wir schnell, dass du vergessen hast due Kunden-IDs in den ON-Teil zu setzen.
SQL:
...
	LEFT JOIN warenausgang AS wa 
		ON we.id_artikel = wa.id_artikel
		AND we.id_kunde = wa.id_kunde
WHERE ...
 
Zuletzt bearbeitet von einem Moderator:
Hallo

soweit hatte ich meine Abfrage inzwischen auch, naja außer der lesbaren Form :rolleyes:.
Ich habe nun
Code:
SELECT 
    we.id_kunde,
    we.id_artikel,
    we.id_warenart,
    we.datum AS ein_datum,
    SUM(we.anzahl) AS ein_anzahl,
    wa.id_kunde,
    wa.id_artikel,
    wa.id_warenart,
    wa.datum AS aus_datum,
    SUM(wa.anzahl) AS aus_anzahl
FROM 
    wareneingang AS we 
    LEFT JOIN warenausgang AS wa 
        ON we.id_artikel = wa.id_artikel
		AND we.id_kunde = wa.id_kunde
WHERE
    we.id_kunde = $kunde
		AND wa.id_kunde = $kunde
GROUP BY
	we.id_kunde, we.id_artikel, we.id_warenart
Aber irgendwie rechnet er manches doppelt.
Wareneingänge Warenausgänge
32.198 (sollten 16.000 und 99 sein also 16.099) es gibt 2 Eingänge27.900 (sollte 13.300 und 350 sein also 13.950) es gibt 2 Ausgänge
11.000 (stimmt) es gibt einen Eingang5.000 (stimmt) es gibt einen Ausgang
4.000 (stimmt) es gibt 2 Eingänge1.000 (sollte 500 sein) es gibt einen Ausgang

Vielleicht gibt es hier auch noch eine Lösung? Ich könnte mir vorstellen das es an der GROUP BY Klausel hängt weil ich dort ja nur den wareneingang gruppiere.

LG Maik
 
item: Du hast we.datum und wa.datim im SELECT Teil. Auch wenn sei nicht im GROUP BY aufgelistet sind, gruppiert MySQL danach, da du auf diese Felder keine GROUP_BY-Funktion gesetzt hast

item: Aus demselben Grund Gruppiert MySQL ebenfalls nach den wa-Feldern

item: Am besten mal das ganze ohne GROUP BY testen. Und dann wenn du ein lauffähiges Query hast, den GROUP BY darüber setzen (also das JOIN-Query als Subquery nehmen)
 
Hallo

gibt es denn vielleicht noch eine andere Lösung um einzeilig alle Ausgänge zusammengerechnet den Eingängen zusammengerechnet gegenüber zu stellen?

Mit dem Join werde ich noch bekloppt.

LG
Maik
 
Hallo

also so
SQL:
SELECT id_kunde, id_artikel AS ein_artikel, id_warenart AS ein_warenart, datum AS ein_datum, SUM( anzahl ) AS ein_anzahl
FROM wareneingang
WHERE id_kunde =1
GROUP BY id_kunde, id_artikel, id_warenart
UNION SELECT id_kunde, id_artikel AS aus_artikel, id_warenart AS aus_warenart, datum AS aus_datum, SUM( anzahl ) AS aus_anzahl
FROM warenausgang
WHERE id_kunde =1
GROUP BY id_kunde, id_artikel, id_warenart
bekomme ich die richtigen Ergebnisse aber eben untereinander.
Warum klappt das dann mit JOIN nicht nebeneinander?

LG Maik

@Yaslaw
Ich weiß schon das JOIN mein Freund ist, aber leiden kann er mich nicht.
Ich bekomme bei allem was ich mache nicht die richtigen Ergebnisse. Sitze nun schon den 3. Tag nur an dieser einen Sache.
 
Zuletzt bearbeitet von einem Moderator:
Dein Problem ist, dass du scheinbar keine klaren Schlüssel zum verknüpfen hast.

Kann eine Kombination id_kunde & id_artikel mehr als eine Zeile haben? Wenn ja, was ist der Schlüssel?
 
ich zeige Dir einfach meine Tabellen, ich denke schon das ich klare Schlüssel habe.
Tabelle artikel
Code:
id, id_kunde, id_warenart, artikel
1, 1, 1, Stift
Tabelle kunde
Code:
id, kunde
1, Ich
Tabelle warenart
Code:
id, warenart
1, Schreiben
Tabelle wareneingang, warenausgang
Code:
id, id_kunde, id_artikel, id_warenart, datum, anzahl
1, 1, 1, 1, 2012-08-07, 3000
Versuch das ganze auszulesen mit
SQL:
SELECT we.id_kunde, we.id_artikel AS ein_artikel, we.id_warenart AS ein_warenart, we.datum AS ein_datum, SUM( we.anzahl ) AS ein_anzahl, wa.id_kunde, wa.id_artikel, wa.id_warenart, wa.datum AS aus_datum, SUM( wa.anzahl ) AS aus_anzahl
FROM wareneingang AS we
LEFT JOIN warenausgang AS wa ON we.id_artikel = wa.id_artikel
WHERE we.id_kunde =1
GROUP BY we.id_kunde, we.id_artikel, we.id_warenart
Nur rechnet er falsch, wahrscheinlich weil ich dann doch irgendwo einen Fehler habe.

LG Maik
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück