2017-01-13 3 views
0

Ich habe Inventory DB Design mit Tabellen stock_transactions und stock_transactions_serials. Die Lagertransaktionstabelle enthält alle IN- und OUT-Transaktionen aus Warehouses. Jede Transaktion kann eine Liste mit zugehörigen Serien haben, die in stock_transactions_serials mit dem Index stock_transaction_id + serial_id aufgezeichnet wird.mysql Inventar Transaktionen - Liste der Serien an Standorten

Ich muss eine Abfrage erstellen, die die Liste der Zeitschriften an allen Standorten auflistet, wo Menge> 0. Ich habe SQL-Geige hier erstellen, um einige Daten zu haben, um auf http://sqlfiddle.com/#!9/520bfa/5 zu arbeiten.

Derzeit meine SQL ist wie folgt:

SELECT 
    ST.id, 
    ST.warehouse_location_id, 
    ST.product_id, 
    SUM(ST.quantity) AS qty, 
    STS.serials AS serials 
FROM stock_transactions ST 
LEFT JOIN (
    SELECT stock_transaction_id, GROUP_CONCAT(serial_id) AS serials 
    FROM stock_transactions_serials 
    GROUP by stock_transaction_id 
) STS ON STS.stock_transaction_id = ST.id 
WHERE 
    ST.document_id = 9 
GROUP BY ST.warehouse_location_id 
HAVING qty > 0 

Das Ergebnis aus dieser SQL nicht ganz richtig ist. QTYs sind richtig, aber die Seriennummern sind falsch ... Es werden keine Serien berücksichtigt, die bei anderen Lagertransaktionen für dieses Dokument übriggeblieben sind oder an den Standort gekommen sind.

Ergebnis sollte sein:

Lage 51 Serien: 22229

Standort 52 Serien: 22221, 22222, 22223, 22224, 22225

UPDATE: nur meine Frage klarer zu machen. Sie bewegen 5 Computer mit den Seriennummern A, B, C, D, E von Standort X nach Y. Jetzt haben Sie 5 Laptops mit Seriennummern an Standort Y. Als nächstes bewegen Sie einen Laptop von Standort Y mit Seriennummer A zurück an Standort X. Und dann noch ein Laptop mit serieller F von Standort X zu Standort Z ... Ich möchte wissen, wie viele Laptops (und welche Serien) an jedem Standort nach all den Transaktionen ....

UPDATE2: möchte Lösung auch für Artikel, die keine Serien haben. Zum Beispiel verschiebe ich 5 USB-Sticks von Ort A nach Ort B. Dann 2 von B nach C. Und schließlich noch 2 von A nach C. Welche Mengen gibt es an jedem Ort?

+1

Die allgemeine GROUP BY-Regel besagt: Wenn eine GROUP BY-Klausel angegeben ist, muss jede Spaltenreferenz in der SELECT-Liste entweder eine Gruppierungsspalte angeben oder das Argument einer SET-Funktion sein! – jarlh

+0

@jarlh Dein Kommentar hilft mir leider nicht viel –

+0

Ich verstehe den Satz nicht, der mit 'Es ist nicht unberechenbar 'beginnt. Bitte klären Sie die Frage. – Shadow

Antwort

1

Die aktuelle Position jedes Assets kann von der letzten in Art der Transaktion abgeleitet werden, die sich auf eine Seriennummer auswirkt. Sie können diese mithilfe der folgenden Abfrage erhalten:

select sts.serial_id, max(st.id) as max_in_id 
from stock_transactions st 
inner join stock_transactions_serials sts on sts.stock_transaction_id = st.id 
where st.type='In' 
group by sts.serial_id 

die obige Abfrage als Unterabfrage verwenden Sie bekommen können, welche Assets verschoben wurden, auf die Lager, um Sie mit den Zählungen Bereitstellung als auch (in Ermangelung einer Öffnung Inventar) .

select st.warehouse_location_id, 
     st.product_id, 
     count(sts.serial_id) as qty, 
     group_concat(sts.serial_id) as serials 
from stock_transactions st 
inner join stock_transactions_serials sts on sts.stock_transaction_id = st.id 
inner join (
    select sts2.serial_id, max(st2.id) as max_in_id 
    from stock_transactions st2 
    inner join stock_transactions_serials sts2 on sts2.stock_transaction_id = st2.id 
    where st2.type='In' 
    group by sts2.serial_id) as max_ins on st.id=max_ins.max_in_id and sts.serial_id=max_ins.serial_id 
group by st.warehouse_location_id, st.product_id 

Die obige Abfrage wird davon ausgegangen, dass Sie nicht die gleiche Seriennummer für verschiedene Produkte haben können, die serial_id Felder auf stock_transaction_id, von der PK impliziert.

+0

Ich teste es ... –

+0

Hatte noch keine Zeit zu testen, aber würde diese Abfrage auch für Material funktionieren, das keine Serien hat? Zum Beispiel 5 Stücke von Ort X bis Y, 3 von Y bis Z, etc ... –

+0

Nein, es wäre nicht, da das nicht die Frage war. – Shadow

Verwandte Themen