FIFO-Implementierung in Inventory mit SQL

8

Dies ist im Grunde ein Inventory-Projekt, das die "Stock In" und "Stock Out" von Artikeln durch Kauf bzw. Verkauf verfolgt.

Das Inventursystem folgt der FIFO-Methode (die Artikel, die zuerst gekauft werden, werden immer zuerst verkauft). Zum Beispiel:

  

Wenn wir Artikel A in den Monaten Januar, Februar und März gekauft haben   Wenn ein Kunde kommt, verschenken wir im Januar gekaufte Artikel   erst wenn die Januar-Items vorbei sind, beginnen wir Februar-Items zu verschenken und so weiter

Also muss ich hier den Gesamtbestand in meiner Hand und die Aufteilung zeigen, damit ich die Gesamtkosten sehen kann.

Aktuelle Tabellendaten:

Die Ergebnismenge muss ich erhalten:

Mein Kunde besteht darauf, dass ich Cursor nicht verwenden soll. Gibt es einen anderen Weg?

    
Harish 08.04.2014, 11:48
quelle

2 Antworten

12

Wie ein Kommentar schon gesagt hat, kann ein CTE das lösen

%Vor%

Wenn der zweite "Artikel B" den falschen Preis hat (der IN-Preis ist 25, der OUT ist 35).
SQL 2008 Geige

Nur zum Spaß, mit SQL Server 2012 und der Einführung der LEAD und LAG-Funktion ist das Gleiche auf eine etwas einfachere Weise möglich

%Vor%

SQL2012-Geige

Aktualisieren
ACHTUNG - & gt; Um die zwei Abfragen vor diesem Punkt zu verwenden, müssen die Daten in der richtigen Reihenfolge sein.

Um die Details mit mehr als einer Zeile pro Tag zu haben, benötigen Sie etwas Zuverlässiges, um die Zeile mit dem gleichen Datum zu sortieren, wie eine Datumsspalte mit Uhrzeit, eine autoincrementale ID oder etwas in derselben Zeile, und es kann nicht verwendet werden Die Abfrage wurde bereits geschrieben, da sie auf der Position der Daten basiert.

Eine bessere Idee ist es, die Daten in IN und OUT aufzuteilen, sie nach Element, wh und Daten zu sortieren und einen Rang auf beide Daten anzuwenden, wie folgt:

%Vor%

SQLFiddle

Aber diese Abfrage ist NICHT absolut zuverlässig, die Reihenfolge der Daten in der gleichen Bestellgruppe ist nicht stabil.

Ich habe die Abfrage nicht geändert, um den Preis neu zu berechnen, wenn sich das IN.Price von dem OUT.Price

unterscheidet     
Serpiton 08.04.2014, 13:22
quelle
2

Wenn Cursor keine Option sind, eine gespeicherte SQLCLR-Prozedur könnte sein. Auf diese Weise können Sie die Rohdaten in Objekten manipulieren / Sortiere es mit Hilfe von getaggt sind oder und stelle die resultierenden Daten als Ausgabe der Prozedur ein. Nicht nur das wird Ihnen das geben, was Sie wollen, es kann sogar viel einfacher sein, als wenn Sie versuchen, dasselbe in reinem T-SQL zu tun, abhängig von Ihrem Programmierhintergrund.

    
Crono 08.04.2014 13:02
quelle

Tags und Links