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

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von TizianK, 23 Mai 2017.

  1. TizianK

    TizianK Benutzer

    Hallo,

    ich habe eine Frage. Ich habe eine Tabelle mit dem Namen KHKArtikel, eine Tabelle mit dem Namen KHKArtikelvarianten und eine Tabelle mit dem Namen KHKStatVK. Ich möchte eine Abfrage machen, in welcher ich "Alle Artikel, inklusive Meldebestand, Aktivität, aktuellem Lagerbestand, Artikelnummer, Bezeichnung und letzter Kundenbewegung" abfrage.

    Ich habe eigentlich schon alles bewerkstelligt, bis auf die letzte Kundenbewegung. Diese findet sich in Form der "BelPosID" in der Tabelle KHKStatVK. Was ich im Endeffekt brauche ist die "höchste BelPosID" zu jedem Artikel. Damit hätte ich schonmal den passenden Datensatz pro Artikel. Nun müsste ich diese BelPosID noch mit dem Feld "Periode" verknüfen und dieses darstellen. Das Feld "Periode" ist wie folgt dargestellt: '2007001' Bedeutet also Januar 2007.

    Meine Abfrage sieht bisher so aus:

    SELECT a.artikelnummer AS Artikelnummer, a.Bezeichnung1, ISNULL(a.Bezeichnung2, '-Keine-') AS Bezeichnung2, v.Meldebestand, v.Lagerbestand, a.Aktiv AS 'Aktiv | -1 = Ja'
    FROM KHKArtikel a
    LEFT OUTER JOIN KHKArtikelvarianten v ON a.Artikelnummer = v.Artikelnummer AND a.Mandant = v.Mandant
    LEFT OUTER JOIN KHKStatVK vk ON a.artikelnummer = vk.Artikel AND a.Mandant = vk.Mandant
    WHERE a.Aktiv = -1 AND v.AuspraegungID = 0
    ORDER BY a.artikelnummer

    Nun geht es eben darum, das oben beschriebene Thema mit der BelPosID etc noch einzufügen.

    Leider bin ich ein ziemlicher Neuling was SQL angeht und habe mir die paar Dinge die ich kann, selber beigebracht. An dieser Stelle bin ich nun an meine Grenzen gestoßen.

    Hat eventuell jemand eine Idee?

    Liebe Grüße,
    Tizian
     
  2. ukulele

    ukulele Datenbank-Guru

    Nun dein Problem ist auf mehrere Arten zu lösen, ich würde so vorgehen (vereinfacht):
    Code:
    SELECT *
    FROM hauptabfrage
    LEFT JOIN (
    
    SELECT ROW_NUMBER() OVER (PARTITION BY Artikel,Mandant ORDER BY KHKStatVK ASC) AS zeile,
    Artikel,Mandant,Periode
    FROM KHKStatVK
    
    ) vk ON a.artikelnummer = vk.Artikel AND a.Mandant = vk.Mandant AND vk.zeile = 1
    Du joinst nicht die eigentliche Tabelle als weiteren Join dazu sondern einen Select der die Zeilennummer mit ROW_NUMBER() ermittelt. Beim Join schränkst du dann zusätzlich zeile = 1 ein.
     
  3. TizianK

    TizianK Benutzer

    Danke dir schonmal für die Hilfe. Allerdings verstehe ich es noch nicht ganz.

    Mein Code sieht nun wie folgt aus:

    Code:
    SELECT a.artikelnummer AS Artikelnummer, a.Bezeichnung1, ISNULL(a.Bezeichnung2, '-Keine-') AS Bezeichnung2, v.Meldebestand, v.Lagerbestand, a.Aktiv AS 'Aktiv | -1 = Ja'
    FROM KHKArtikel a
    LEFT OUTER JOIN KHKArtikelvarianten v ON a.Artikelnummer = v.Artikelnummer AND a.Mandant = v.Mandant
    LEFT JOIN (
    
    SELECT ROW_NUMBER() OVER (PARTITION BY Artikel, Mandant ORDER BY KHKStatVK ASC) AS zeile,
    Artikel, Mandant, Periode
    FROM KHKStatVK vk
    
    ) 
    
    vk ON a.artikelnummer = vk.Artikel AND a.Mandant = vk.Mandant AND vk.zeile = 1
    WHERE a.Aktiv = -1 AND v.AuspraegungID = 0
    ORDER BY a.artikelnummer
    SQL sagt mir "falscher Spaltenname KHKStatVK" in Zeile 6.
    Mach ich da irgendwas falsch?
     
  4. ukulele

    ukulele Datenbank-Guru

    Und SQL hat recht, ich hab ausversehen den Tabellennamen eingesetzt, da muss "BelPosID" hin als ORDER-Kriterium.
     
  5. TizianK

    TizianK Benutzer

    Danke dir! Nun hab ich schonmal ein Ergebnis. Allerdings habe ich gerade die Gegenprobe mit der Tabelle KHKStatVK gemacht und dabei festgestellt, dass im Ergebnis immer der kleinste "Perioden-Wert" und der kleinste "BelPosID-Wert" angezeigt werden und nicht der größte.
    Eventuell muss man das noch irgendwie mit
    Code:
    SELECT(MAX)
    kombinieren? Ist nur ne Laienaussage :p
     
  6. TizianK

    TizianK Benutzer

    Ich rudere zurück. Bin selbst drauf gekommen, dass ich lediglich "ASC" durch "DESC" ersetzen muss :)
     
  7. ukulele

    ukulele Datenbank-Guru

    Richtig, ist eigentlich kein Hexenwerk wenn man erstmal versteht was ROW_NUMBER() OVER () macht. Dazu kannst du auch nur den Subselect ausführen und gucken, ob das mit der Zählung so richtig ist.
     
  8. TizianK

    TizianK Benutzer

    Super. Ich danke dir echt vielmals für die Hilfe. :)
     
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