Wir haben bei uns eine komplexe Provisionsberechnung für die ich den Ver- und Einkaufspreis eines Artikels zu jeder verkauften Bestellung wissen muss (zum Zeitpunkt der Bestellung). Wie kann ich die zu den jeweiligen Artikeln einer Bestellung ermitteln (Shopware 5.1.5) ?
Ich habe in der Datenbank eine s_articles_prices Tabelle gefunden in der es einen baseprice gibt. Ist das der Einkaufspreis?
Wenn ja: wie kann ich den zur Bestellung zuordnen? Über articleID scheint es nicht zu gehen, da erhalte ich mehrere Einträge für 1 articleID.
und warum kann man das nicht über die ID zuordnen?
SQL Lösung:
Du hast doch eine OrderID in s_order.
Da verjoinst du die ID mit der orderID aus der Tabelle s_order_details und du hast
deine Artikel IDs (articleID) der Bestellung.
Darauf ein SUM auf s_articles_details (purchaseprice) mit einem WHERE articleID IN (articleIDs aus der ersten Abfrage) und
zack hast du den Einkaufspreis berechnet.
PS: Feld quantity aus s_order_details nicht vergessen. Kann ja sein, dass jemand einen Artikel mehrfach bestellt.
Hallo Martin und danke für deine Antwort, leider hilft sie mir nicht mein Problem zu lösen.In der Tabelle s_articles_details habe ich kein purchaseprice oder irgendwas ähnliches.
Auch wenn es sich um den baseprice in der Tabelle s_articles_prices handelt, kann man auch diesen ermitteln.
Die Tabelle hat ja auch eine articleID.
Man müsste dann
wie oben beschrieben OrderID aus s_order mit s_order_detailt verjoinen.
Dann in der s_articles_prices die Artikel ermitteln, die sich zwischen den Feldern „from“ und „to“ befinden (falls sich euer Einkaufspreis „baseprice“ je je nach Einkaufsmenge bei euch ändert)
Ok also der baseprice ist tatsächlich der Einkaufspreis, schon mal gut zu wissen.
Jetzt hab ich nur noch das Problem, dass es für eine artikelID mehrere zutreffende Einträge in s_articles_prices gibt. Ist das jetzt eine Fehlkonfiguration unsererseits oder ist das durchaus normal?
Dann in s_order_details nicht über articleID sondern über „articleordernumber“ gehen. == Die ist in „s_articles_details“ die „ordernumber“
Daraus (also aus s_articles_details) die ID nehmen und in s_articles_prices die „articledetailsID“ selektieren und man
hat die korrekte Variante
FROM shopware.s_order_details od ON od.ordernumber = 123
INNER JOIN shopware.s_order o ON o.id = od.orderID
INNER JOIN shopware.s_articles_details ad ON ad.ordernumber = od.articleordernumber
INNER JOIN shopware.s_articles_prices ap ON ap.articleID = ad.articleID AND ap.articledetailsID = ad.id AND ap.pricegroup = 'EK'
Damit ist meine Anzahl Rückgabewerte allerdings von 339 auf 250 reduziert was mich stutzig macht.
Jetzt bin ich aber wirklich weg für eine Stunde: Habe mal ein wenig rumgespielt: [SELECT](http://dev.mysql.com/doc/refman/5.5/en/select.html) [s\_order](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order).ordernumber, [SUM](http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html#function_sum)(([s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices).price + ([s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices).price / 100 \* [s\_order\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order_details).tax\_rate)) \* [s\_order\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order_details).quantity), [SUM](http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html#function_sum)([s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices).baseprice \* [s\_order\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order_details).quantity) FROM [s\_order\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order_details) INNER [JOIN](http://dev.mysql.com/doc/refman/5.5/en/join.html) [s\_order](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order) ON [s\_order](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order).id = [s\_order\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order_details).orderID INNER [JOIN](http://dev.mysql.com/doc/refman/5.5/en/join.html) [s\_articles\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_details) ON [s\_order\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order_details).articleordernumber = [s\_articles\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_details).ordernumber INNER [JOIN](http://dev.mysql.com/doc/refman/5.5/en/join.html) [s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices) ON [s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices).articleID = [s\_articles\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_details).articleID [AND](http://dev.mysql.com/doc/refman/5.5/en/logical-operators.html#operator_and)[s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices).articledetailsID = [s\_articles\_details](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_details).id [AND](http://dev.mysql.com/doc/refman/5.5/en/logical-operators.html#operator_and) [s\_articles\_prices](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_articles_prices).pricegroup = 'EK' WHERE [s\_order](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order).ordernumber != 0 [AND](http://dev.mysql.com/doc/refman/5.5/en/logical-operators.html#operator_and)[s\_order](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order).ordernumber = 20003 GROUP BY [s\_order](http://192.168.33.10/adminer.php?username=root&db=shopware&table=s_order).ordernumber
Beispiel bezieht sich auf eine meiner ordern 20003
Lässt man die weg, dann kommt 1 Datensatz pro Bestellung