Summe über gruppen
-
Hallo,
in einer Tabelle stehen Lagerbewegungen, vereinfacht:
- von (integer und Verweis auf ein Lager)
- nach (int und Verweis auf ein Lager)
- menge (int)wie bekomme ich nun in einer Abfrage den Lagerbestand?
Also irgendwie : "Select SUM(wenn von positiv dann menge sonst -menge) from tabelle1 group by (von und nach)"Das gewünschte Ergebnis wär dann:
LG Menge
1 20
2 37
3 -18
...Gruß
Anton
-
Wenn aus jedem Lager mindestens einmal etwas raus- und reingeht, kann man sowas bauen:
SELECT lager1, raus - rein AS differenz FROM (( SELECT von AS lager1, SUM(menge) AS raus FROM lagerbewegungen GROUP BY von ) AS t1) INNER JOIN (( SELECT nach AS lager2, SUM(menge) AS rein FROM lagerbewegungen GROUP BY nach ) AS t2) ON lager1 = lager2
Aber wenn aus einem Lager nichts rausging oder in ein Lager nichts reinkam, versagt natürlich der Join.
-
Also auf Läger ohne Bewegungen kann ich verzichten, nicht aber auf die, die nur Aus- oder Eingänge haben.
-
Gibt es noch andere Ideeen die das Problem lösen, denn der bisherig Vorschlag ist keider ja nicht nutzbar?
-
Kannst du nicht am Anfang der Tabelle für jedes Lager einen Nulltransfer einfügen? Ansonsten schau dir mal ifnull (oder was auch immer dein DBS anbietet) an.
-
Naja es sind momentan über 40 Lagerorte, und wenn ich das richtig verstehe müsste ich für jede Möglichkeit dies einfügen, macht ca 1600 \\"Null-Einträge\\". Nicht wirklich befriedigend.... Zur Not muss ich das dann in SW machen (ausserhalb meiner DB) - aber auch net toll...
-
Ne, du musst nur 40 Null-Einträge machen. Es reicht für jedes Lager, je einmal etwas rein- und etwas rausgebracht zu haben.
-
Wenn ich dich richtig verstehe, gibt es eine Tabelle Lagerbewegung, in der die Bewegungen aus (von,nach,menge) bestehen. Vermutlich gibt es noch eine Tabelle Lagerstamm, die die einzelnen Lager definiert. Dann müsste es in etwa so gehen:
select ls.lager, sum(lb.menge) from ( select von as lager, -menge as menge from lagerbewegung union all select nach, menge from lagerbewegung ) lb right join lagerstamm ls on lb.lager = ls.lager group by ls.lager