URL: https://www.overclockers.at/coding-stuff/sql_query_problem_171257/page_1 - zur Vollversion wechseln!
Hallo Leute,
Folgendes Problem habe ich:
In einer SQL2000 DB habe ich drei Tabellen. Artikel, Lagerzugaenge und Lagerabgaenge.
Jetzt will ich für einen bestimmten Artikel die Summe aller Lagerzugänge und die Summe aller Lagerabgänge abfragen.
Frage ich zb nur die Zugänge für einen Artikel ab funkt es.
SELECT Artikel.Nr, Artikel.Kurzbez, Artikel.Bezeichnung, Artikel.Hersteller, SUM(Lagerzugaenge.Menge) FROM Artikel, Lagerzugaenge WHERE Artikel.Hersteller = '139' AND Artikel.Nr = '3011' AND Lagerzugaenge.Artikel = Artikel.Nr GROUP BY Artikel.Kurzbez, Artikel.Nr, Artikel.Bezeichnung, Artikel.Hersteller ORDER BY Artikel.Bezeichnung;
Frage ich aber in der Query die Zugänge und die Abgänge zur gleichen Zeit ab, bekomme ich Werte die überhaupt nicht mehr stimmen.
SELECT Artikel.Nr, Artikel.Kurzbez, Artikel.Bezeichnung, Artikel.Hersteller, SUM(Lagerzugaenge.Menge), SUM(Lagerabgaenge.Menge) FROM Artikel, Lagerzugaenge, Lagerabgaenge WHERE Artikel.Hersteller = '139' AND Artikel.Nr = '3011' AND Lagerzugaenge.Artikel = Artikel.Nr AND Lagerabgaenge.Artikel = Artikel.Nr GROUP BY Artikel.Kurzbez, Artikel.Nr, Artikel.Bezeichnung, Artikel.Hersteller ORDER BY Artikel.Bezeichnung;
Kann mir jemand helfen? Wo ist mein Denkfehler? Es sollte doch möglich sein zwei SUM() in einer Query zu verwenden, oder?
Danke
tuoni
Zitat von tuoniAND Lagerzugaenge.Artikel = Artikel.Nr AND Lagerabgaenge.Artikel = Artikel.Nr
Ok. Aber das ist nicht mein Problem.
Mein Problem ist folgendes:
Für jede Lagerbewegung wird zb in der Tabelle Lagerzugaenge eine Zeile mit Artikelnummer und Menge geschrieben.
Rufe ich jetzt in meiner Query mit der SUM() Funktion die Summe aller Zugänge für einen bestimmten Artikel ab, bekomme ich einen richtigen Wert. zb 2100
Rufe ich aber im selben Query auch noch die Abgänge mit einer SUM() Funktion ab, bekomme ich für den gleichen Artikel nicht mehr 2100 Zugänge sonder zb 264000.
Und das verstehe ich nicht ganz.
mfg
tuoni
So wie ich das sehe hast du für die Zugangsmenge eines Artikels ein Kreuzprodukt mit sämtlichen Abgangsmengen wodurch die Mördersumme rauskommt.
Zitat von tuoniRufe ich aber im selben Query auch noch die Abgänge mit einer SUM() Funktion ab, bekomme ich für den gleichen Artikel nicht mehr 2100 Zugänge sonder zb 264000.
Zwei SUM() Functions in einem Query erscheinen mir auch etwas ... dubios
.
Leg dir doch eine View für jeweils alle Eingänge und Ausgänge an:
viewEingang:
viewAusgang:Code:SELECT Eingang.ArtikelId, SUM(Eingang.Menge) AS Eingang FROM Eingang GROUP BY Eingang.ArtikelId
... und mach ein Query dann darüber:Code:SELECT Ausgang.ArtikelId, SUM(Ausgang.Menge) AS Ausgang FROM Ausgang GROUP BY Ausgang.ArtikelId
So sollte es jedenfalls klappen, eine elegantere Lösung fällt mir so auf die schnelle nicht ein ...Code:SELECT Artikel.Id, Artikel.Bezeichnung, viewEingang.Eingang, viewAusgang.Ausgang FROM Artikel LEFT JOIN viewAusgang ON Artikel.Id = viewAusgang.ArtikelId LEFT JOIN viewEingang ON Artikel.Id = viewEingang.ArtikelId

meinst du nicht - das es effizienter wäre nur eine tabelle mit den lagerbewegungen zu haben? zugänge mit +betrag, abgänge mit -betrag. ev. kannst ja noch ein "art" feld mit einbinden fall gewünscht in dem du die art der buchung zusätzlich abspeicherst "Z" - Zugang, "A" - Abgang, "M" - Manuelle Buchung usw...
nur als Anregung, weiss ja nicht inwieweit die Struktur deiner DB schon vorgegeben ist
Zitat von tuoniWo ist mein Denkfehler?
OK. Bin im Bilde wo der Fehler lag. Werde es entweder in zwei Abfragen teilen oder mit views arbeiten.
Danke an alle für die rasche Hilfe.
@robobimbo: Leider ist es nicht möglich die Struktur der DB zu ändern. Ist eine gekaufte WAWI.
Danke
tuoni
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026