Komplizierte Abfrage

8

Ich bin mir nicht sicher, ob das Folgende mit einer bloßen SELECT-Anweisung erledigt werden kann, aber ich habe zwei Tabellen (abgeschnitten mit den für das Problem notwendigen Daten).

Inventarelement

  • id int (PRIMÄR)
  • Menge int

Bestand - Enthält Änderungen im Bestand des Lagerbestands (Bestandsverlauf)

  • id int (PRIMÄR)
  • inventory_item_id int (FREMDSCHLÜSSEL)
  • Menge int
  • erstellt datetime

Die Menge auf Lager ist die Bestandsänderung, während die Menge in der Inventarposition die aktuelle Menge dieses Artikels ist

ALLES IN% running COLUMN RÜCKKEHR 0

%Vor%

DIE FRAGE

Nun möchte ich Folgendes wissen: Ist es möglich, alle Daten in der Bestandstabelle auszuwählen, in denen die laufende Menge des inventory_item jemals Null wird, indem ein SELECT?

verwendet wird

Ich weiß, dass dies programmgesteuert erfolgen kann, indem einfach alle Bestandsdaten in einer Position ausgewählt werden und die Bestandsmenge von der aktuellen Bestandsartikelmenge, die die Menge vor der Bestandsänderung erhält, einzeln subtrahiert wird. Kann ich dies mit einem SELECT tun?

    
Kirk Backus 01.07.2013, 17:13
quelle

5 Antworten

2

Ich nehme es an:

%Vor%

Dieser hat den relativen Vorteil, dass er nur einen Durchlauf an die Lagerliste geben muss. Abhängig von der Größe und den Indizes darauf, die eine gute Sache sein können oder nicht.

    
Francisco Soto 01.07.2013, 17:28
quelle
5

(Aktualisiert) Angenommen, es wird nie mehr als einen Datensatz für eine gegebene Kombination aus inventory_item_id und erstellt geben, versuchen Sie:

%Vor%     
Mark Bannister 01.07.2013 17:22
quelle
2

Der logischste Weg ist eine kumulative Summe. Aber MySQL unterstützt das nicht.

Der klarste Ansatz ist meiner Meinung nach, eine korrelierte Unterabfrage zu verwenden, um die laufende Menge zu erhalten. Dann ist es eine einfache Sache einer where -Klausel, wo sie 0 ist:

%Vor%     
Gordon Linoff 01.07.2013 17:25
quelle
2

Ich hatte eine ähnliche Antwort basierend auf einer laufenden Summe, die gekennzeichnet werden sollte hier gefunden ...

Sie können MySQL @ variables verwenden, aber die Daten müssen vorher abgefragt und nach den Daten der Aktivität sortiert werden ... dann setzen Sie ein Flag in jeder Zeile, die das Negative verursacht, und behalten nur diese. Etwas wie

%Vor%

Auf diese Weise wird für jedes Inventarelement nach dem Erstellungsdatum rückwärts gearbeitet (Reihenfolge nach dem erstellten Absteigen pro ID). Wenn sich also die Inventar-ID ändert, sehen Sie im Feld "Menge" der Inventurtabelle nach, um die Anzahl der verwendeten Bestände zu erhöhen. Wenn dieselbe ID wie der letzte verarbeitete Datensatz verwendet wird, verwenden Sie einfach den laufenden Saldo und subtrahieren Sie die Menge dieses Bestandseintrags.

    
DRapp 01.07.2013 17:31
quelle
2

Ich glaube, dass dies ein einfacher Ansatz ist.

%Vor%     
Tom 01.07.2013 17:30
quelle

Tags und Links