SQL Abfrage

TizianK

Benutzer
Beiträge
16
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
 
Werbung:
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.
 
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?
 
Und SQL hat recht, ich hab ausversehen den Tabellennamen eingesetzt, da muss "BelPosID" hin als ORDER-Kriterium.
 
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
 
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.
 
Werbung:
Zurück
Oben