• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

SQL - Summe aus Spalte Wenn Inhalt XYZ

Bourbon

Mitglied
Hallo Leute,

ich kämpfe nun schon eine Weile mit den Datensätzen unserer Uralt-Datenbank.

Und zwar habe ich folgende, für das Problem relevanten Felder:
  • Vorgang
  • Arbeitsschritt
  • Menge
  • Art
Und jetzt würde ich gerne folgendes bauen:
eine Art Bestand, das heißt:
  • Summe aller Zugänge eines Vorgangs - Summe aller Abgänge eines Vorgangs des jeweils gleichen Arbeitsschrittes
Lässt sich so etwas mit SQL umsetzen?

Beispiel:

Summe von "Art = Zugang" & "Arbeitsschritt = Lager Gutteile" - Summe von "Art = Abgang" & "Arbeitsschritt = Lager Gutteile" AS "Lagerbestand"

Die Ausgabe erfolgt direkt in Excel, also muss das nur mit SQL Code erreichbar sein.

Grüße und im Voraus schon mal vielen Dank!
 
Werbung:
Hallo,

Du hast Dir doch die Antwort im Prinzip schon selbst gegeben:
Code:
select
    (sum(a.Menge) - max(b.Menge)) as Summe
from
    tabelle a
join
    ( select sum(Menge) Menge, Arbeitsschritt from tabelle where Art = 'Abgang' group by Arbeitsschritt ) b
    on a.Arbeitsschritt = b.Arbeitsschritt
where
    a.Arbeitsschritt = 'Lager Gutteile'
    and a.Art = 'Zugang'
 
Werbung:
Mmmh, also bis zu dem Punkt, an dem alles mit Bestand > 0 herausfiltern wollte, hat es prima geklappt:

Code:
Select
  Positionen.Artikelnummer As Art_Nr,
  (Sum(ZuM.Menge) - Sum(AbM.Menge)) As Bestand
From
  Meldungen As ZuM Inner Join
  Positionen
    On ZuM.PositionsID = Positionen.ID,
  Meldungen As AbM
Where
  ZuM.PositionsID = AbM.PositionsID And
  ZuM.Art = 'Zugang' And
  AbM.Art = 'Abgang' AND
  ZuM.Arbeitsschritt = AbM.Arbeitsschritt AND
  Bestand > 0
Group By
  Positionen.Artikelnummer

Nur jetzt kommt immer die Meldung, das ein fehlender Parameter nicht übergeben wurde.
Die Genau Meldung lautet:
1 Parameter wurden erwartet, aber es wurden zu wenig Parameter übergeben.
 
Zuletzt bearbeitet:
Ich denke, die Bedingungen müssten mit in den Join:
Code:
Select
    Positionen.Artikelnummer As Art_Nr,
    (Sum(ZuM.Menge) - Sum(AbM.Menge)) As Bestand
From
    Meldungen As ZuM
Inner Join
    Positionen
    On ZuM.PositionsID = Positionen.ID
Inner Join
    Meldungen As AbM
    On ZuM.PositionsID = AbM.PositionsID
    and ZuM.Arbeitsschritt = AbM.Arbeitsschritt
    and AbM.Art = 'Abgang'
Where
    ZuM.Art = 'Zugang'
    and Bestand > 0
Group By
    Positionen.Artikelnummer
...weiterhin denke ich ( ungetestet ), dass er hier Zeile für Zeile bezogen auf AbM liefert.
Schau Dir nochmal meinen ersten Beitrag an und versuch einfach nur Tabellen- und Spaltennamen anzupassen.
 
Werbung:
Habe es mal so probiert, aber da kommt immer ein Fehler:

Code:
select
    (sum(ZuM.Menge) - max(AbM.Menge)) as Summe,
    ZuM.PositionsID
from
    Meldungen AS ZuM
join
    ( select sum(Menge), Positionsid AS Menge, Arbeitsschritt from Meldungen AS AbM where Art = 'Abgang' AND Arbeitsschritt ='Lager_Keller-Gutteile' group by Arbeitsschritt ) AbM
    on ZuM.Arbeitsschritt = AbM.Arbeitsschritt AND ZuM.PositionsID = AbM.PositionsID
where
    ZuM.Arbeitsschritt = 'Lager_Keller-Gutteile'
    and ZuM.Art = 'Zugang'

Fehler:
Das angegebene Feld 'AbM.PositionsID' kann sich auf mehr als eine der Tabellen beziehen, die im FROM-Abschnitt der SQl-Anweisung angegeben werden.
 
Zuletzt bearbeitet:
Hast Du mal Deinen korrekten Tabellenaufbau für mich, damit ich das mal nachstellen kann?
Vielleicht Testdaten, wenn möglich?
 
Anbei eine CSV Datei.
Mein Ziel ist es, dass ich das wie folgt sehe:
  • für jede PositionsID den jeweiligen Lagerbestand nach
  • Bemerkung (entspricht Kistennummer)
  • Arbeitsschritt (entspricht Zustand)
 

Anhänge

  • MeldungenMDB.TXT
    26,2 KB · Aufrufe: 1
Werbung:
Du hast da ein paar kleine Fehlerchen drin gehabt :-)
Das hier liefert mir 52 Zeilen, musst du mal schauen, ob es das ist, was Du brauchst:
Code:
select
    ZuM.PositionsID,
    (sum(ZuM.Menge) - max(AbM.Menge)) as Summe
from
    Meldungen AS ZuM
join
    ( select sum(Menge) Menge, Positionsid, Arbeitsschritt from Meldungen AS AbM where Art = 'Abgang' group by Arbeitsschritt, Positionsid ) AbM
    on ZuM.Arbeitsschritt = AbM.Arbeitsschritt
    AND ZuM.PositionsID = AbM.PositionsID
where
    ZuM.Arbeitsschritt = 'Lager_Keller-Gutteile'
    and ZuM.Art = 'Zugang'
group by
    ZuM.PositionsID
order by
    ZuM.PositionsID
 
Na klasse, es funktioniert! :)

Vielen herzlichen Dank!

Und wie bekomme ich es jetzt noch hin, dass ich nur Summe > 0 haben? Sicherlich mit Having, aber da schimpft er wegen fehlenden Parametern.
 
Also MSSQL Server sollte mit Having funktionieren, teste das mal:
Code:
select
    ZuM.PositionsID,
    (sum(ZuM.Menge) - max(AbM.Menge)) as Summe
from
    Meldungen AS ZuM
join
    ( select sum(Menge) Menge, Positionsid, Arbeitsschritt from Meldungen AS AbM where Art = 'Abgang' group by Arbeitsschritt, Positionsid ) AbM
    on ZuM.Arbeitsschritt = AbM.Arbeitsschritt
    AND ZuM.PositionsID = AbM.PositionsID
where
    ZuM.Arbeitsschritt = 'Lager_Keller-Gutteile'
    and ZuM.Art = 'Zugang'
group by
    ZuM.PositionsID
having
    (sum(ZuM.Menge) - max(AbM.Menge)) > 0
order by
    ZuM.PositionsID
 
Werbung:
Hat prima funktioniert!

Jetzt kämpfe ich noch etwas damit, eine dritte Tabelle Namens Positionen einzubauen, aber das sollte sich ja lösen lassen.
 
Zurück
Oben