dedlfix: SQL Abfrage: Artikel die innerhalb letzten JAhres bestellt wurden ausblenden

Beitrag lesen

Tach!

ich habe zwei Tabellen (Lagerartikel und Bestellartikel)

In beiden Tabellen stehen unsere Artikel drin. In der Bestallartikel Tabelle steht das Bestelldatum drin. Ich möchte nun aus der Lagerartikel Tabelle alle Datensätze aufgelistet haben, die aber die letzten 12 MOnate nicht mehr bestellt wurden.

Und nur diese Artikel. Die die aktuell innerhalb des Jahres bestellt wurden sollen nciht angezeigt werden. Ich stehe auf dem Schlauch und weis nicht wie.

Ein Verständnis von Mengen hilft bei solchen Aufgabenstellungen, sie zunächst einmal möglichst exakt formulieren zu können. Du hast also eine Menge Lagerartikel. Und du hast eine Menge Bestellungen, von denen du nur die der jüngsten 12 Monate berücksichtigen möchtest. Für diese beiden Mengen kannst du nun zunächst einmal einzelne Abfragen stellen, um zu prüfen, ob sie für sich genommen die richtigen Daten liefern. Bei den Lagerartikeln ist das in dem Fall nicht weiter sinnvoll, weil davon erstmal einfach alle berücksichtigt werden sollen. Die Bestelldaten hingegen brauchen eine WHERE-Klausel zum einschränken. Zudem benötigst du von diesen nur die Artikelnummer, so dass du zum Prüfen auf die richtige Datenmenge zwar * angeben kannst, aber dann die Feldliste auf die Artikelnummer beschränken kannst. Zudem brauchst du davon nur eindeutige Werte, also kannst du (musst aber nicht, wie wir gleich sehen werden) die Artikelnummern mit DISTINCT eindampfen. Das ergibt sinngemäß diese Query:

SELECT artikelnr FROM Bestellungen WHERE in_den_vergangenen_12_Monaten

Und nun möchtest du die Einträge aus den Lagerdaten, die nicht in der eben ermittelten Datenmenge der Bestellungen enthalten ist. Das ist dann ein einfaches Zusammenfügen der beiden Abfragen mittels NOT IN.

SELECT was_du_brauchst FROM lagerartikel WHERE nr NOT IN (SELECT artikelnr FROM Bestellungen WHERE in_den_vergangenen_12_Monaten)

Das erwähnte DISTINCT könnte so eingefügt werden

… IN (SELECT DISTINCT artikelnr FROM Bestellungen …)

aber es stört nicht, wenn die Werte mehrfach auftreten. Das Ergebnis des Ausdrucks änderet sich davon nicht.

Alternativ ginge auch NOT EXISTS, wenn die Daten über mehr Kriterien als nur die nr verknüpft werden müssen.

SELECT * FROM lagerartikel WHERE NOT EXISTS (SELECT * FROM bestellungen WHERE in_den_vergangenen_12_Monaten AND lagerartikel.nr = bestellungen.artikelnr AND lagerartikel.anderes_kriterium = bestellungen.anderes_kriterium )

dedlfix.