Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQL Abfrage letzter Preis für Artikel

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von rolandggg, 23 Februar 2016.

  1. rolandggg

    rolandggg Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    du könntest mit row_number() die einzelnen Preise je Artikel nach Datum absteigend nummerieren und dann auf row_number = 1 filtern.
     
  3. rolandggg

    rolandggg Neuer Benutzer

    Wäre möglich aber wie bekomme ich es hin, das der letzte Preis immer die Nummer 1 hat?
     
  4. ukulele

    ukulele Datenbank-Guru

    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
     
    rolandggg gefällt das.
  5. ukulele

    ukulele Datenbank-Guru

    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
     
  6. rolandggg

    rolandggg Neuer Benutzer

    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!
     
  7. ukulele

    ukulele Datenbank-Guru

    Die wird natürlich bei zwei Preisen am selben Datum auch zwei Zeilen liefern, das tut die mit ROW_NUMBER() nicht.
     
  8. rolandggg

    rolandggg Neuer Benutzer

    Stimmt, dieses Problem ist mir in der Praxis gerade aufgefallen, daher werde ich mal die andere Version testen!
    Danke!!!!
     
  9. ukulele

    ukulele Datenbank-Guru

    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.
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Solche Fehler können auch via Constraints zuverlässig vermieden werden.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden