"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

SQL Query Problem

tuoni 08.11.2006 - 11:04 1015 8
Posts

tuoni

Bloody Newbie
Avatar
Registered: Aug 2003
Location: Vienna
Posts: 7
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

Luzandro

OC Addicted
Avatar
Registered: Mar 2006
Location: 2482
Posts: 708
Zitat von tuoni
AND Lagerzugaenge.Artikel = Artikel.Nr AND Lagerabgaenge.Artikel = Artikel.Nr

Damit bekommst du die Artikel, für die es sowohl Zugänge als auch Abgänge gibt - sollte es nur eines davon geben, brauchst du Outer Joins

tuoni

Bloody Newbie
Avatar
Registered: Aug 2003
Location: Vienna
Posts: 7
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

M.I.P.S.

Big d00d
Avatar
Registered: Mar 2002
Location: On the inside
Posts: 324
So wie ich das sehe hast du für die Zugangsmenge eines Artikels ein Kreuzprodukt mit sämtlichen Abgangsmengen wodurch die Mördersumme rauskommt.
Bearbeitet von M.I.P.S. am 08.11.2006, 12:57

rettich

Legend
waffle, waffle!
Avatar
Registered: Jan 2004
Location: wien
Posts: 794
Zitat von tuoni
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.

wie groupst du in einer query sowohl nach eingängen als auch nach ausgängen? IMHO geht das nciht.

Gulinborsti

Addicted
Avatar
Registered: Mar 2004
Location: Wien
Posts: 469
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:
Code:
SELECT Eingang.ArtikelId, SUM(Eingang.Menge) AS Eingang
FROM Eingang
GROUP BY Eingang.ArtikelId
viewAusgang:
Code:
SELECT Ausgang.ArtikelId, SUM(Ausgang.Menge) AS Ausgang
FROM Ausgang
GROUP BY Ausgang.ArtikelId
... und mach ein Query dann darüber:
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
So sollte es jedenfalls klappen, eine elegantere Lösung fällt mir so auf die schnelle nicht ein ... :p

DirtyHarry

aka robobimbo
Avatar
Registered: Apr 2001
Location: outer space
Posts: 464
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

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Zitat von tuoni
Wo ist mein Denkfehler?

Du bekommst für jeden Zugang alle Abgänge.

tuoni

Bloody Newbie
Avatar
Registered: Aug 2003
Location: Vienna
Posts: 7
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
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz