SQL Querry Abfrage probleme

FiiireFox

Cadet 4th Year
Registriert
Okt. 2013
Beiträge
92
Hallo Zusammen,

ich habe eine kurze Frage zu meiner SQL Anweisung.

In meiner SQL Anweisung wird ein Lagerbestand berechnet dies geschieht indem er in einer Tabelle Lager die Spalte Menge aller gleichen Artikel zusammenzählt. Das ganze funktioniert soweit auch bisher sehr gut, allerdings werden auch die Mengen der Lager die gesperrt sind hin zugezählt was allerdings falsch ist.

In dieser Tabelle Lager gibt es auch noch eine 'gesperrt' Tabelle in der festgelegt wird ob ein Lager gesperrt ist oder nicht.

Meine Frage ist nun wie schaffe ich das die SUM Berechnung nur das berechnet wo die Lager nicht gesperrt sind.
Ich kann ja nach einer SUM Berechnung nicht noch gleich eine Abfrage bringen wie kann ich das ganze also realisieren?

Vielen Dank
FiiireFOx
 
Bin kein Experte, aber ein SubSelect in der Anfrage, der nur nicht-gesperrte Lager zurückliefert, wäre meine erste Überlegung.
 
...es wäre auch echt hilfreich, die SQL Abfrage, die Du schon hast, auch mal zu SEHEN - so ist das Stochern im Nebel.
Abgesehen davon stimme ich meinem Vorredner zu - Subselect klingt nach der richtigen Richtung. Aber ohne konkretes Beispiel kann man da echt nicht viel sagen.
 
wie meine vorredner schon sagten, subselect oder einen left join von der sperrtabelle auf die lagerbestandstabellle und bei der summierung dann die gesperrten lager entsprechend ignorieren.
 
Hier die SQL Abfrage :)


SELECT P.ArtNr, A.KdNr,P.AuftrNr, NVL(T.BestellDatum,P.Lieftermin), NVL(T.Teilmenge,P.Menge - NVL(P.Liefermenge, 0)), SUM(L.MENGE), D.DISPONENT, per.name,
P.AuftrPosNr, NVL(T.BestNrFremd, P.BestNrFremd)
FROM wcadm.TermStaffAufPos T, wcadm.AuftrPos P, wcadm.Auftrag A, wcadm.Kunde K, wcadm.Artikel AR, wcadm.ARTDISPONENT D, wcadm.LAGER L, wcadm. Personalstamm PER
WHERE A.AuftrNr = P.AuftrNr AND P.ARTNR=D.ARTNR AND A.KdNr = K.KdNr AND NVL(T.Typ,'B') = 'B' AND NVL(DECODE(T.Geliefert,0, 0,NULL, 0, T.Geliefert), NVL(P.Abrufsumme, 0)) = 0 AND P.Status != 'erledigt'
AND NVL(T.TeilMenge,P.Menge - (NVL(P.LIeferMenge, 0))) >= 0 AND AR.ArtNr = P.ArtNr AND P.AuftrNr = T.AuftrNr AND P.AuftrPosnr = T.AuftrPosNr AND A.Auftrart != 'F'
AND ( DECODE(DECODE(T.BestellDatum,NULL,1,0),0, T.BestellDatum,NULL, T.BestellDatum, P.Lieftermin) > '01.01.01' AND
( DECODE(DECODE(T.BestellDatum,NULL,1,0),0, T.BestellDatum,NULL, T.BestellDatum, P.Lieftermin) < SYSDATE ) )AND P.ARTNR = L.ARTNR(+) AND D.DISPONENT = PER.PERSNR


GROUP BY P.AuftrNr,
P.AuftrPosNr, NVL(T.BestNrFremd, P.BestNrFremd), NVL(T.BestellDatum,P.Lieftermin), NVL(T.Teilmenge,P.Menge - NVL(P.Liefermenge, 0)), P.ArtNr, A.Aufsuch, A.KdNr, K.Matchcode,
AR.ArtGru, NVL(P.ZeichNr, AR.ZeichNr), NVL(T.WunschDatum,P.KdWuTermin), P.KdArtNr, A.AuftrArt, AR.TeileArt, AR.GewichtBrutto, NVL(T.VersandZeit,P.VersandZeit), AR.APLNR, P.SetNr,
A.Liefort, A.Abladestelle, A.WerkNr, T.TerminKz, AR.Gebinde, AR.Matchcode, AR.IdentNr, A.LiefName1, A.LiefName2, A.LiefName3, A.LiefOrtPlz, A.LiefPfach, A.LiefPfachPlz, A.LiefStrasse,
A.SpeditionNr, AR.ProjektNr, P.Index1, P.MengeEinh, AR.LagerEinheit, P.SetNr, A.Datum, '', AR.Sachbearbeiter, A.WerkNrEigen, K.Sachbearbeiter, NVL(T.Kennzeichen,P.FreigabeKz),
K.KlassifizKz, K.Sperrung, D.DISPONENT, PER.name
ORDER BY 1
 
FiiireFox schrieb:
In dieser Tabelle Lager gibt es auch noch eine 'gesperrt' Tabelle in der festgelegt wird ob ein Lager gesperrt ist oder nicht.

In der Tabelle noch eine Tabelle? Ich denke nicht. Für konkrete Hilfe musst Du Dich präzise ausdrücken.

Wenn in der Gesperrt Tabelle nur gesperrte Lager IDs drin sind, wäre wie schon vorgeschlagen ein Subselect eine Möglichkeit. Wenn dort alle Lager IDs drin sind und ein gesperrt Flag und Du die Artikel damit irgendwie verjoinen kannst, wenn die Artikel Tabelle z.B. direkt die Lager ID als Fremdschlüssel hat oder über weitere Tabellen gejoint werden kann, dann joine die Tabelle und filter auf das gesperrt Flag...
 
... puh ok das ist ja mal ein ganz schön dicker brummer.

Ohne die dahinterliegenden DB zu haben und somit Änderungen an der Query testen zu können, scheint mir folgender Ansatz möglich:

Du joinst ja sowieso da alle Tabellen zusammen, um am Ende ein Ergebnis zusammenzubekommen, in dem alle Artikel aus allen Lagern inklusive Mengensumme aufgelistet sind.
Kannst Du nicht noch von der Lager-Tabelle auf die genannte "Gesperrt"-Tabelle joinen, und in der join-Bedingung die gesperrten Lager ausschliessen? Somit sollte Deine Summe dann doch die Artikelmengen aus den gesperrten Lagern nicht enthalten, und das Problem wäre gelöst?

Ich muss leider nach wie vor ein bischen raten und vermuten, aber der Ansatz klingt nach einer Möglichkeit.
 
​Erstmal grundsätzliches zum Statement:

Verwende für deine Abfrage über mehrere Tabellen bitte JOINS. Dies macht dein Statement nicht nur lesbarer, sondern auch performanter.

Grundsätzlich ist die Syntax wie unten zitiert.

SELECT table1.this, table2.that, table2.somethingelse
FROM
table1
INNER JOIN table2
ON table1.foreignkey = table2.primarykey
WHERE (some other conditions)

Ich bin kein Fan davon jemand anderes die Lösung zu verraten, denn das meiste lernt man indem man seine Fehler selber findet oder versucht den anderen zu erklären, was man als Ergebnis haben möchte und wie man vorgegangen ist. Vielleicht findest du deinen Fehler ja selber wenn du das Statement umschreibst.

Meine Vorredner und ich können nur raten wie die Datenbank dahinter aussieht. Drexel und psychead haben dir Möglichkeiten aufgezeigt, wie man so etwas lösen könnte.
 
Zurück
Oben