View Full Version : SQL Problem
weidenhammer
29-10-09, 20:30
Hallo allerseits,
ich habe ein kleines Problem, welches ich mit einer SQL Abfrage lüsen möchte.
Ich habe eine Lagerbewegungsdatei, in der alle Lagerbewegungen mit Teilenummer, Bewegungsdatum, Bewegungsschlüssel, Menge etc. erfasst sind.
Ziel ist es, für jede Teilenummer das jeweils älteste Bewegungsdatum mit einem bestimmten Bewegungsschlüssel zu finden.
Kann mir da jemand helfen?
Vielen Dank und Gruss
Alexander May
Wie wärs damit:
select lbfirm, lbwknr, lbtenr, max(lbdate)
from lgbw
where ... lbbwsl='xx'
group by lbfirm, lbwknr, lbtenr
Wie wär's damit
Select TeileNr, Max(BewDatum)
From LagBew
Where BewSchl = 'XX'
Group By TeileNr;
Wenn Du jeweils den kompletten Datensatz brauchst, musst Du zusätzlich entweder eine Common Table Expression oder ein Sub-Select verwenden:
With x as (Select TeileNr, Max(BewDatum) as MinDat
From LagBew
Where BewSchl = 'XX'
Group By TeileNr)
Select a.*
from x join LagBew a on x.TeileNr = a.TeileNr
and MinDat = a.BewDatum
and a.BewSchl = 'XX'
Birgitta
weidenhammer
29-10-09, 21:33
Hallo Ihr Beiden,
vielen Dank, habt mir sehr geholfen, ich stand mal wieder auf der Leitung/Schlauch etc..........
Grüsse
Alexander
... wobei man da mehrere Sätze bekommen könnte, wenn es an dem ältesten Datum 2 Bewegungen gab, was einem bei dem Subselect auf die Füße fällt.
Bei den CTEs finde ich die Syntax ein wenig seltsam (wo muss das Ding stehen), die je nach Statement variiert, verschärft dadurch, dass unterschiedliche Datenbanken sich da unterschiedlich darstellen. Deswegen ziehe ich zuweilen einen nested select vor ala:
Select a.*
from (Select TeileNr, Max(BewDatum) as MinDat
From LagBew
Where BewSchl = 'XX'
Group By TeileNr) x
join LagBew a on x.TeileNr = a.TeileNr
and MinDat = a.BewDatum
and a.BewSchl = 'XX'
Wie wär's damit
Select TeileNr, Max(BewDatum)
From LagBew
Where BewSchl = 'XX'
Group By TeileNr;
Wenn Du jeweils den kompletten Datensatz brauchst, musst Du zusätzlich entweder eine Common Table Expression oder ein Sub-Select verwenden:
With x as (Select TeileNr, Max(BewDatum) as MinDat
From LagBew
Where BewSchl = 'XX'
Group By TeileNr)
Select a.*
from x join LagBew a on x.TeileNr = a.TeileNr
and MinDat = a.BewDatum
and a.BewSchl = 'XX'
Birgitta
CTEs sind doch ganz einfach:
Das sind temporäre Views, die nur für das aktuelle Statement gelten, die vor dem eigentlichen Select-Statement angegeben werden müssen.
Werden mehrere CTEs verwendet, werden diese einfach durch Kommata getrennt aufgelistet.
Ich vermeide Sub-Selects soweit möglich, einfach aus dem Grund spätestenfalls wenn man das 3. Sub-Select verschachtelt, ist die Anweisung nicht mehr lesbar.
... im richtigen Leben hätte man statt den verschachtelten Sub-Selects oder den Common-Table-Expressions entsprechende Views, die eingesetzt werden. Und schwupp entspricht die Abfrage dem endgültigen Select-Statement in der Variante mit CTEs. ;)
Birgitta