Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Abfrage nach neuestem Datum pro Typ (SQL)

Begonnen von Stardave, Juni 08, 2015, 00:36:06

⏪ vorheriges - nächstes ⏩

Stardave

Hallo zusammen,

folgendes Szenario:
Ich hab hier zwei Tabellen:

tblMaterial
mat_id
mat_name

tblArtikel
art_id
art_nr
art_datum
mat_id_fk

Da unsere Artikel immer wieder ein Upgrade erhalten ändert sich die Artikel-Nr. aber nicht deren Name. Bestellt werden sollte nur der mit dem neuestem Upgrade.
Nun suche ich nach einer Möglichkeit nur diese bestellbaren mir anzuzeigen.
Optionsfeld (bestellbar: ja/nein) ist möglich aber umständlich.
Per Abfrage nach Datum filtern hört sich für mich nach der besten Lösung.
Oder gibt es hierfür noch eine eleganteren Weg?

Ich hab nach bestem Wissen und Gewissen einige Codes-Beispiele gefunden und versucht umzusetzen.
Mit SELECT WHERE/INNER JOIN/MAX/DMAX/DOMMAX ect. So viel verschiedenes und nix will so wie ich. (Liegt gewiss an mir)

Mit diesem Code...
SELECT tblArtikel.mat_id_fk, tblArtikel.art_id, tblArtikel.art_nr, Max(tblArtikel.art_datum) AS Maxvonart_datum
FROM tblArtikel
GROUP BY tblArtikel.art_nr, tblArtikel.mat_id_fk, tblArtikel.art_id;


Bekomme ich das hier... (Ist auch klar)


Aber benötige das hier ohne die Zeilen welche blau durchgestrichen sind.


Könntet ihr mir bitte, bitte bei dem Code helfen?

Danke im Voraus!



DF6GL

Hallo,


SELECT *  FROM tblArtikel
Where MaxvonArt_Datum in (Select top 1 B.MaxVonArt_Datum from tblArtikel as B order by B.MaxVonArt_Datum desc)
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Stardave

Hallo DF6GL

Das MaxvonArt_Datum wurde bei meinem Code automatisch erzeugt.
Hab es dann in art_datum geändert und soweit funktioniert dein Code.
Allerdings habe ich hier ein Problem:
Wenn alle Artikel ein Upgrade am gleichen Tag bekommen, wird mir von jedem Artikel das Neueste (mit gleichem Datum) angezeigt.
Wenn ich aber ein neues Upgrade (neue art_nr und neues art_datum) eingebe dann zeigt die Abfrage hier nur den einen neuen Artikel an.
Ich bräuchte hier aber alle Artikel mit dem jüngstem Datum.

Könntest du mir noch einmal helfen.

Danke!


ebs17

ZitatDa unsere Artikel immer wieder ein Upgrade erhalten ändert sich die Artikel-Nr. aber nicht deren Name.
Ein Artikel-Name kommt aber in dem bisher gezeigten nicht vor ...?
Gruppiert wird dafür nach einer Artikel-ID (eindeutig?) und nach wechselnden Artikelnummern, was dann sachlich Unsinn ist.

Etwa (nach den jetzigen Informationen):
SELECT
   A.*
FROM
   tblArtikel AS A
      INNER JOIN
         (
            SELECT
               ArtName,
               MAX(art_datum) AS LastDate
            FROM
               tblArtikel
            GROUP BY
               ArtName
         ) AS X
         ON A.ArtName = X.ArtName
            AND
         A.art_datum = X.LastDate

Mit freundlichem Glück Auf!

Eberhard

Stardave

Hallo Eberhard,

ZitatEin Artikel-Name kommt aber in dem bisher gezeigten nicht vor ...?
Richtig, ein Artikel-Name kommt nicht vor, mein Fehler. Sorry. Es sollte hier mat_name heißen aus der tblMaterial welche über mat_id und mat_id_fk mit der tblArtikel in Beziehung steht. (Siehe Screenshot 1)

Über art_id zu gruppieren ist sicherlich Unsinn da es nur jeweils eine gibt.
Werde dein Code anpassen und ausprobieren.

Eine Frage noch zu deinem Code:
Was machen die Buchstaben A und X?
Sind diese bestimmt und gehören zum Ausdruck oder sind sie frei wählbar?
Sind das Variablen?
Wird die SELECT-Anweisung in den Klammern zuerst aufgelöst?

Vielen Dank


Stardave

#5
Fettes Merci an die zwei Helfer.
Nach Anpassung macht der Code was er soll!

SELECT
   A.*
FROM
   tblArtikel AS A
      INNER JOIN
         (
            SELECT
               mat_id_fk,
               MAX(art_datum) AS LastDate
            FROM
               tblArtikel
            GROUP BY
              mat_id_fk
         ) AS X
         ON A.mat_id_fk = X.mat_id_fk
            AND
         A.art_datum = X.LastDate


Vielen Dank!

ebs17

ZitatWas machen die Buchstaben A und X?

Das sind Aliasnamen für Tabellen, siehe Grundlagen - SQL ist leicht (2) - Alias.

ZitatWird die SELECT-Anweisung in den Klammern zuerst aufgelöst?

Das kann man in diesem Fall sagen. Die Abarbeitung einer Abfrage beginnt mit dem FROM-Teil, also dem Bezug der Tabellen. Daher muss die Unterabfrage eingangs ausgeführt werden.
Mit freundlichem Glück Auf!

Eberhard