
Zitat von
Crypi
Guten Morgen liebes Forum,
frohes neues Jahr! :-)
Ich hadere momentan mit einem Problem.
Es ist ein Lager (Inventur) bei dem festgestellt werden soll, wieviel die bestehenden Lagerbestände wert sind.
Ich habe eine Tabelle in der zu einzelnen Positionen Summen gebildet werden.
Lager
| laufendenummer | laufendenummer_einzelteil | bestand |
Lieferung
| laufendenummer| laufendenummer_einzelteil | menge | preis | datum |
Mit jeder Lieferung die eingebucht wird, erhöht sich der Bestand im Lager.
Über die Zeit wird jetzt aber auch etwas aus dem Lager gebucht.
Dass heißt der Bestand reduziert sich.
Ich möchte jetzt Feststellen wieviel das was ich im Lager habe wert ist.
Dafür muss ich soviele Lieferungen erfassen, wie nötig sind um mit deren Liefermenge den aktuellen Bestand zu erreichen.
Mit den in den Lieferungen angegebenen Preisen kann ich dann den Wert bestimmen.
Ich möchte dies jetzt aber für alle Bestände in einer Abfrage erledigen.
Mein einziges brauchbares Ergebnis, dass ich bisher vorweisen kann ist:
Select * from Lager as a
left join Lieferung as b
on a.laufendenummer_einzelteil = b.laufendenummer_einzelteil
hiermit bekäme ich dann aber alle jemals gelieferten Lieferungen... was eindeutig zu viel ist.
Die nächste Möglichkeit wäre
Select * from Lager as a
left join Lieferung as b
on a.laufendenummer_einzelteil = b.laufendenummer_einzelteil
left join Lieferung as c
on a.laufendenummer_einzelteil = c.laufendenummer_einzelteil and b.laufendenummer<>c.laufendenummer
...
dabei könnte ich dann soviele joins hinzufügen wie ich Lieferungen erfassen will. Dabei kann es dann aber vorkommen, dass ich nicht genug Lieferungen erfasse weil ich es auf z.B. fünf beschränkt habe.
Ich suche jetzt eine Lösung bei der ich genau so viele Lieferungen erfasse um den Bestand zu erreichen.
Gibt es eine Möglichkeit das zu realisieren?
Ich danke euch für eure Mühe!
Crypi
Irgendwie so:
Code:
test=*# select * from lager;
id | teil_id | bestand
----+---------+---------
1 | 1 | 10
2 | 2 | 200
3 | 3 | 30
(3 rows)
test=*# select * from lieferung;
id | teil_id | menge | preis | datum
----+---------+-------+-------+------------
1 | 1 | 5 | 2.10 | 2012-01-01
2 | 1 | 10 | 2.05 | 2012-01-02
3 | 2 | 300 | 3.00 | 2012-01-03
4 | 3 | 20 | 10.00 | 2012-01-04
5 | 1 | 10 | 1.99 | 2012-01-04
6 | 1 | 20 | 1.90 | 2012-01-05
7 | 1 | 2 | 0.50 | 2012-01-06
(7 rows)
test=*# select * from (select * from lager left join (select *, sum(menge) over (partition by teil_id order by datum desc) from lieferung order by teil_id) foo on lager.teil_id = foo.teil_id order by lager.teil_id) bla where (sum - menge) < bestand;
id | teil_id | bestand | id | teil_id | menge | preis | datum | sum
----+---------+---------+----+---------+-------+-------+------------+-----
1 | 1 | 10 | 7 | 1 | 2 | 0.50 | 2012-01-06 | 2
1 | 1 | 10 | 6 | 1 | 20 | 1.90 | 2012-01-05 | 22
2 | 2 | 200 | 3 | 2 | 300 | 3.00 | 2012-01-03 | 300
3 | 3 | 30 | 4 | 3 | 20 | 10.00 | 2012-01-04 | 20
(4 rows)
Oder?
Falls ich mich nicht verhauhen habe, sollte es passen. Prüfe es aber noch mal durch. Für einen produktiven Code die * noch eliminieren! Voraussetzung ist PG größer gleich 8.4.
Andreas
Lesezeichen