PHP rocks! wünscht allen Mitgliedern einen guten Rutsch ins neue Jahr 2017 !!!
Hinweis: Das Forum zieht um! Um keine Datenverluste zu haben, schalten wir zwecks Übernahme der Daten das Forum am Sonntag, den 24.04.2016 um ca. 21:00 Uhr offline und passen anschliessend die DNS-Einträge an.
www.php-rocks.de wird euch dann nach den Aktualisierungen der DNS-Server wieder wie gewohnt uneingeschränkt zur Verfügung stehen.
Danke für euer Verständnis!

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
MSSQL/T-SQL zusammenfassende Verkaufszahlen über Stücklisten
#1
Hallo,

Ich mache mir glaube ich das Leben gerade selbst schwer.

Im Prinzip eine einfache Aufgabe, ich möchte Verkaufszahlen eines bestimmten Artikels ermitteln:
Code:
SELECT sum(vp.Menge)
FROM Verkaufspositionen vp
WHERE vp.Artikelnummer = '0815'

Nun gibt es allerdings Handelsstücklisten, die sich aus Positionen einzelner Artikel zusammensetzen.
Ich muss nun alle Handelsstücklisten-Verkäufe berücksichtigen, in denen der Artikel 0815 enthalten ist:
Code:
SELECT sum(vp.Menge)
FROM Verkaufspositionen vp
WHERE vp.Artikelnummer in ( SELECT Stueckliste FROM Stuecklisten WHERE element='0815' )

Das könnte man natürlich einfach zusammenführen:
Code:
SELECT sum(vp.Menge)
FROM Verkaufspositionen vp
WHERE vp.Artikelnummer = '0815'
   OR vp.Artikelnummer in ( SELECT Stueckliste FROM Stuecklisten WHERE element='0815' )

Allerdings kann die 0815 auch mit Menge > 1 in einer Stückliste vorhanden sein.
Wenn also die 0815 in der Stückliste A 2x vorkommt, muss natürlich auch die verkaufte Menge der Stückliste mit 2 multipliziert werden.
Und hier stehe ich grad auf dem Schlauch, weil ich nicht drauf komme, wie ich das zusammenfassen soll.

Vielleicht bin ich auch auf dem falschen Weg?

Danke für Hinweise und Tipps!

Gruß Arne
Antworten
#2
Hallo Arne
Code:
Vielleicht bin ich auch auf dem falschen Weg?
Das kann gut möglich sein, ehrlich gesagt ich muß Deinen Post ein par mal lesen und komme noch nicht ganz dahinter was genau Deine Frage ist?

Code:
Im Prinzip eine einfache Aufgabe, ich möchte Verkaufszahlen eines bestimmten Artikels ermitteln:
Soweit ok.
Code:
Nun gibt es allerdings Handelsstücklisten, die sich aus Positionen einzelner Artikel zusammensetzen.
Ich muss nun alle Handelsstücklisten-Verkäufe berücksichtigen, in denen der Artikel 0815 enthalten ist:
Wenn es hier Probleme gibt bei dieser einfachen Aufgabe scheint irgendwas unklar zu sein mit Deiner DB-Struktur?
Code:
Nun gibt es allerdings Handelsstücklisten
Ehrlich gesagt habe ich dieses Wort "Handelsstücklisten" noch nie in keinem Zusammenhang gehört
"Verkaufspositionen "
Wenn Du diese Tabelle Verkaufspositionen hast solltest Du auch alle Verkaufspositionen dort hinein schreiben.
Code:
vp.Artikelnummer
ist eine klare Ansage "Handelstücklisten" scheint eine andere DB/DB-Logik zu sein, versteh ich grad nicht?
Kannst Du die DB-Struktur konkretisieren.
Code:
Wenn also die 0815 in der Stückliste A 2x vorkommt, muss natürlich auch die verkaufte Menge der Stückliste mit 2 multipliziert werden.
Das erschließt sich mir so nicht, es liest sich so als wäre Verkaufspositionen nicht "transactional" und als wären diese Werte von einer anderen Tabelle Handelstücklisten abhängig?

Code:
Und hier stehe ich grad auf dem Schlauch, weil ich nicht drauf komme, wie ich das zusammenfassen soll.
Ich stehe da ehrlich gesagt auch auf dem Schlauch, ich verstehe die Fragestellung nicht ganz und kenne Deine DB-Struktur nicht!

Hilft kein JOIN?
Antworten
#3
Hi Till,

Danke dass Du Dich damit auseinandersetzt.

Ich versuche mal die Grundlage darzustellen. Interessant sind eigentlich nur zwei Tabellen:
  • Verkaufspositionen
  • Stuecklisten

In der Tabelle Verkaufspositionen befinden sich logischerweise die verkauften Artikel mit Angabe der Menge.
In der Tabelle Stuecklisten befinden sich die sog. Handelsstücklisten.

Was sind nun Handelsstücklisten?
Nehmen wir an, Du hast zwei Standardartikel ( Artikelnummer, Bezeichnung ):
  • 123, Smartphone
  • 456, MicroSD-Karte
Jetzt gibt es einen weiteren Artikel 789, der sich aus den beiden Artikeln 123 und 456 zusammensetzt.
Bestellst Du also den Artikel 789, erhältst Du die beiden Artikel 123 und 456.

Es ist ähnlich wie ein Set, nur dass Sets in den meisten ERP-Systemen als "Standard"-Artikel behandelt werden, d.h. die Beschaffung erfolgt in der Konstellation über einen Lieferanten. Bei Handelsstücklisten bestellst Du die Einzelartikel beim Lieferanten und stellst diese eben als Stückliste zur Verfügung.

Warenwirtschaftlich wird in den Belegen nun die 789 verkauft und in die Tabelle Verkaufspositionen eingetragen, lagerführend werden allerdings die 123 und 456 gebucht.

Mein Problem ist nun, dass ich wissen muss, wie oft die 123 insgesamt verkauft wurde.
Also einmal als Einzelartikel zzgl. der Verkäufe in Stücklisten.

Ich kann wohl ermitteln, wie oft die 123 und die 789, in der die 123 enthalten ist verkauft wurde.

Das Problem ist nun, dass ein Artikel, wie bspw. die 456 auch mehrfach in einer Stückliste vorkommen kann, also 1x die 123 und 2x die 456.
Dann stimmen die Verkaufszahlen des Artikel 456 nicht über die Stückliste, weil die 789 nur einmal verkauft wurde, prinzipiell die 456 aber 2x!

Wie oft die 456 in der 789 enthalten ist, steht zwar in der Tabelle Stuecklisten, aber mir fehlt echt die Idee, das zusammenzuführen.

Danke
Antworten
#4
Union?
Antworten
#5
Hallo,

Ich weiß nicht, ob mich das weiter bringt.
Mit union fasse ich ja zwei oder mehr Abfragen mit denselben Spaltentypen zusammen.

Mein Problem ist, dass ich ja die Anzahl 2 der 456 aus der Stückliste mit der verkauften Menge von 789 multiplizieren muss.

Danke
Antworten
#6
Probier mal ne Variante von (ich kann es leider nicht testen):

SELECT sum(vp.Menge * ifNull(anzahl, 0))
FROM Verkaufspositionen vp
left outer join (select stuueckliste,element, count(*) as anzahl from stuecklisten group by stueckliste, element)  as t on t.stueckliste = vp.artikelnummer
WHERE vp.Artikelnummer = '0815'
Antworten
#7
Hi,

Da bekomme ich 0 raus, obwohl 7049 Stück verkauft sind.
Aber ich teste damit mal rum, könnte der richtige Weg sein, danke!
Antworten
#8
Die Bedingung ist ja auch falsch Wink

Im Join will man ja die mit element = '0815'
Dann muss auch die Where Bedingung noch geändert werden. Die haben ja eine andere Artikelnummer.


Also, ich würde tatsächlich mit einem Union anfangen:

ein select für einzeln verkaufte Artikel, das andere für die in einer Stückliste enthaltenen. Könnte am einfachsten sein.
Antworten
#9
Die Bedingung habe ich natürlich schon angepasst. ;-)
Ich bin nun auch schon soweit, dass ich Verkaufszahlen bekomme, aber zu hohe noch. Da ist der Hund noch irgendwo begraben, aber soll ja auch nicht kangweilig werden. Big Grin
Antworten
#10
Hallo,
da seid Ihr wohl schneller, ... mit JOIN sollte es gehen.

Ist Dein DB-Schema vorgegeben oder entwirfst Du es selbst?

Zitat:Wie oft die 456 in der 789 enthalten ist, steht zwar in der Tabelle Stuecklisten, aber mir fehlt echt die Idee, das zusammenzuführen.
Wo steht das?

Wie sieht Dein schema genau aus?

Verkaufspositionen (Artikelnummer , Menge)
Stuecklisten (Stueckliste, Artikelnummer, Menge, Bezeichnung)

Was ist Stueckliste?

Geht es nicht mit irgendeinem Baum besser, also statt stückliste z.B. parent?
Wenn parent=0 pder parent='' handelt es sich um eine Stückkliste, wäre das eine Idee?
Statt Stueckliste trägst Du die Artikelnummer der Stückliste in einen zusätzlichen (parent) Eintrag
ein welchen Du natürlich in der Anzeige/Ausgabe ausblenden mußt parent<>0
Die Stuecklisten ergeben sich ja aus vp.

So oder so ähnlich würde ich das machen?
Antworten


Gehe zu: