Letzten Datensatz per SQL eindeutig ermitteln

Simon15285

Neuer Benutzer
Beiträge
2
Hallo zusammen,

vorweg, ich bin noch recht unerfahren auf dem Gebiet von MS SQL und damit verbundenen Datenbankabfragen. Von daher hoffe ich auf euer Verständnis, wenn hier und da meinerseits die Probleme nicht ganz so verständlich rüber kommen 🙈

Folgende Auswertung aus unser Datenbank würde ich gerne generieren:

Nach Möglichkeit soll mir für einen Zeitraum (Datum von xy bis Datum yz) jeweils der letzte Wareneingang eines Artikels angezeigt werden. Alle notwendigen Informationen liegen in einer Datenbanktabelle, es müssten also keine Tabellen miteinander verknüpft werden.

Mein Problem ist, dass ich die Abfrage nicht so geschrieben bekomme, dass ich je Artikel nur einen bzw. den letzten Wareneingang erhalte, da es u.U. in einem Zeitraum je Artikel mehrere Wareneingänge gibt.

Als eingrenzendes Merkmal zu den Wareneingängen würde ein Buchungsschlüssel fungieren, der ebenfalls als eigenes Feld in der Tabelle der Lagerbuchungen auswertbar ist.

Eventuell lässt sich folgende Abfrage so erweitern/umbauen, dass ich ans Ziele gelange (das Durchsuchen mehrerer Foren hat mich noch nicht wirklich weiter gebracht und nur fehlerhafte Ergebnisse oder Fehlermeldungen ergeben):

SELECT identnr as Teilenr, bestnr as Bestellnr, belegnummer as Rechnung, bu_dat as Datum, menge as Menge, epreis as Einkaufspreis
FROM l100
WHERE bus = '30' and bu_dat >= :+feld_v5 and bu_dat <= :+feld_b5
--die Felder feld_v5 und feld_b5 benötige ich, um im ERP-System das Datum per Eingabe eingrenzen zu können, der Buchungsschlüssel grenzt die Wareneingangsbuchungen ab
ORDER BY identnr

So erhalte ich für einen Zeitraum alle Buchungen, die unter dem Buchungsschlüssel '30' gebucht worden sind. Wie oben schon beschrieben wäre es mein Wunsch, je Artikel nur noch eine eindeutige Zeile zu bekommen.
Folgender Hinweis noch:
Es kann sein, dass ein Artikel an einem Tag zur gleichen Bestellung und Belegnummer mehrere Buchungspositionen aufweist, wenn mehrere einzelne Paletten eingebucht werden. Ich weiß nicht, ob das für die Abfrage relevant ist und u.U. zu Problemen führen könnte. Im Ergebnis ist es für mich nur wichtig, dass es nur noch eine Position je Artikel gibt, unabhängig, obs die Gesamtmenge oder Teilmenge widerspiegelt.

Ich hoffe, ich konnte das Problem einigermaßen verständlich und nachvollziehbar beschreiben. Falls ihr noch Fragen habt, versuche ich natürlich diese bestmöglich zu beantworten 😃

Für eine Unterstützung wäre ich sehr dankbar!

Gruß
Simon
 
Werbung:
Du selektierst das MAXimum des Eingangsdatums mit der Aggregat Funktion MAX() und den Wert, der für Dich identifizierend ist in dem Fall, also vermutlich identnr:
Code:
Select identnr, max(bu_dat)
von Deiner Tabelle
Code:
Select identnr, max(bu_dat) from l100
mit deinen Suchkriterien
Code:
WHERE bus = '30' and bu_dat >= :+feld_v5 and bu_dat <= :+feld_b5
und der passenden GROUP BY Clause zur Aggregat Funktion
Code:
Select identnr, max(bu_dat) bu_dat_max from l100
WHERE bus = '30' and bu_dat >= :+feld_v5 and bu_dat <= :+feld_b5
Group by identnr
Du musst immer alle Felder gruppieren, die in der Ausgabe nicht aggregiert sind, zumindest ist das meistens so, eine Faustregel.

Jetzt solltest Du die Werte haben, die Dich interessieren. Also die records mit dem jeweils neuesten Eingang.

Jetzt kommt der Rest:
Um alle Felder ausgeben zu können, die Dich interessieren, musst Du diese Menge wieder mit Deiner ursprünglichen Tabelle joinen, über die identnr und bu_dat_max. Probier mal ..
 
Werbung:
Guten Abend und vielen Dank für eure schnellen Rückmeldungen und eure Hilfe!

Habs mit folgendem Skript erstmal einigermaßen geschafft, dass zu erreichen, was für mich wichtig war:

SELECT l100.identnr, l100.bu_dat, l100.belegnummer
FROM l100 INNER JOIN
(SELECT identnr, MAX(bu_dat) AS maxdat
FROM l100
WHERE bus = '30' AND bu_dat >= :+feld_v5 AND bu_dat <= :+feld_b5
GROUP BY identnr)
l100_1 ON l100.identnr = l100_1.identnr AND l100.bu_dat = l100_1.maxdat
WHERE l100.bus ='30'
ORDER BY l100.identnr

So bekomme ich schon mal die letzten Buchungen je Artikel angezeigt. Von daher kann ich damit schon sehr gut arbeiten!
Rein interessehalber aber noch folgende Frage:

Wie oben schon erwähnt kann es sein, dass dennoch ein Artikel bei dieser Abfrage mehrfach auftaucht, wenn am selben Tag zur selben Belegnummer etc. einzelne Positionen eingebucht worden sind.
Beispielhaft liefert mir die Abfrage dann so ein Ergebnis:

identnr bu_dat belegnummer
Teil1 31.03.2023 Beleg12
Teil1 31.03.2023 Beleg12

Hier bin ich noch nicht weitergekommen, wie sich das mit einer weiteren group by oder so auf eine Artikelnummer gruppieren ließe.
Falls hierzu noch jemand eine Idee hätte, wäre das natürlich super. Aber komme auch erstmal so zu recht.
Von daher nochmals vielen Dank für die schnelle Hilfe!

Viele Grüße
Simon
 
Zurück
Oben