SQL Abfrage letzter Preis für Artikel

rolandggg

Neuer Benutzer
Beiträge
4
Hallo!
Ich hätte bitte eine Frage an die Profis!
Und zwar möchte ich folgende Abfrage erstellen!

Ich habe zwei Tabellen die einen nennt sich OpArtPreise hier gibt es folgende Werte die ich brauche:
ArtikelId,Preis,PersonId(=LieferantenId),VonDatum

Die zweite Tabelle nennt sich opArtLief(Artikel_Lieferantenbeziehung) hier gibt es folgende Werte:
LiefId,ArtikelId

Wenn ich die beiden Tabellen verknüpfe gibt es jetzt für einen Lieferanten mehrere Einträge eines Artikels mit unterschiedlichen Preisen!
Ich möchte für den Lieferanten den Artikel sehen mit dem letzten Preis!

Ich habe folgende "falsche" Abfrage:

select.
max(APR.VonDatum) As MaxDatum,
APR.ArtikelId,
ALI.LiefId,
APR.Preis

from OpArtPreise APR (NOLOCK)
JOIN OpArtLief ALI (NOLOCK) ON ALI.ArtikelId = APR.ArtikelId and ALI.LiefId = APR.PersonId
GROUP BY APR.ArtikelID, ALI.LiefId,APR.Preis
ORDER BY APR.ArtikelId

mit dieser Abfrage sehe ich leider nicht den letzten Preis sondern alle, ich weiß das ich es irgendwie mit einem Subselect ? lösen muss, steh aber momentan auf der Leitung und komme trotz Google zu keiner Lösung.

Wäre super wenn mir da jemand helfen könnte sonst verzweifle ich noch!

Vielen Dank
 
Werbung:
Man könnte auch erst per GROUP BY das Datum ermitteln und dann den Preis dazu joinen. Wird natürlich etwas unübersichtlich dadurch das es eh schon einen Join gibt.
Code:
SELECT    t.MaxDatum,
        t.ArtikelId,
        t.LiefId,
        APR.Preis
FROM    (

SELECT    max(APR.VonDatum) AS MaxDatum,
        APR.ArtikelId,
        ALI.LiefId
FROM    OpArtPreise APR (NOLOCK)
INNER JOIN OpArtLief ALI (NOLOCK)
ON        ALI.ArtikelId = APR.ArtikelId
AND        ALI.LiefId = APR.PersonId
GROUP BY APR.ArtikelID,ALI.LiefId

        ) t
INNER JOIN OpArtPreise APR
ON        t.ArtikelId = APR.ArtikelId
AND        t.LiefId = APR.PersonId
AND        t.MaxDatum = APR.VonDatum
ORDER BY t.ArtikelId
 
Was akretschmer mein wäre in etwa so:

Code:
SELECT    t.MaxDatum,
        t.ArtikelId,
        t.LiefId,
        t.Preis
FROM    (

SELECT    ROW_NUMBER() OVER (PARTITION BY APR.VonDatum,APR.ArtikelId,ALI.LiefId ORDER BY APR.Preis) AS zaehler,
        APR.VonDatum,
        APR.ArtikelId,
        ALI.LiefId,
        APR.Preis
FROM    OpArtPreise APR (NOLOCK)
INNER JOIN OpArtLief ALI (NOLOCK)
ON        ALI.ArtikelId = APR.ArtikelId
AND        ALI.LiefId = APR.PersonId
GROUP BY APR.ArtikelID,ALI.LiefId,APR.Preis

        ) t
WHERE    t.zaehler = 1
ORDER BY t.ArtikelId
 
Vielen Dank! Besonders an Ukulele!
Mit den zwei Varianten komm ich auf jeden Fall weiter, obwohl mir die ursprünglich von Ukulele besser gefällt!
 
Dann stellt sich natürlich die Frage welcher Preis gilt, oder sind beide Preise identisch? Dann ginge auch DISTINCT, aber schön ist das ja nicht.
 
Werbung:
Zurück
Oben