Door
Ramon van Dongen
op 07-02-2019 15:20
gewijzigd op 07-02-2019 15:21
2.859 views
Hallo,
Ik heb de volgende tabellen:
- varianten (opdrachten)
- varianten_datums (datums onder een opdracht)
- varianten_inhoud (producten per datum)
Het was eerst vrij eenvoudig om per maand de totale omzet op te halen.
SELECT
SUM(varianten_inhoud.inhoud_aantal * varianten_inhoud.inhoud_prijs) AS omzet
,MONTH(varianten_datums.datum) AS maand
,YEAR(varianten_datums.datum) AS jaar
FROM
varianten_inhoud
LEFT JOIN varianten_datums ON
varianten_inhoud.variant_datum_ID = varianten_datums.variant_datum_ID
LEFT JOIN varianten ON
varianten_datums.variant_ID = varianten.variant_ID
GROUP BY
MONTH(varianten_datums.datum)
, YEAR(varianten_datums.datum)
Maar nu is er in de tabel varianten een variabele korting bijgekomen. Die heeft betrekking op de gehele opdracht, niet specifiek op één datum of één product. Als ik deze variabele niet meer reken is de totale omzet natuurlijk te hoog.
Hoe kan ik dit qua query het beste doen?
Het is geen probleem om de korting te berekenen voor alleen maar "varianten_datums.soortdatum = 0" maar er moet dan dus iets met een CASE achtigs iets in de query.
Heeft iemand tips?
Je benoemt zelf al min of meer het probleem: bepaalde factoren veranderen over tijd. Zo zou de prijs ook over tijd kunnen veranderen. Dit zou ook inhouden dat omzet uit het verleden ineens meer of minder zou kunnen worden. Je zou dit dus eigenlijk apart moeten vastleggen, voor welke bedragen en tegen welke korting dingen daadwerkelijk zijn verkocht. Voor de goede orde zou je dit dus allemaal "redundant" moeten opslaan.
Volgens mij doen pakketten als Magento dit ook: die trekken gewoon een kopie van de op dat moment geldende prijzen en kortingen als er een bestelling uit gaat.
SELECT
(CASE WHEN varianten_datums.soortdatum = 0 THEN (SUM(varianten_inhoud.inhoud_aantal * varianten_inhoud.inhoud_prijs) - varianten.korting) ELSE SUM(varianten_inhoud.inhoud_aantal * varianten_inhoud.inhoud_prijs) END) AS omzet
...
Werkt in elk geval niet. Bedragen kloppen dan niet.
[size=xsmall]Toevoeging op 07/02/2019 15:56:40:[/size]
Thomas van den Heuvel op 07/02/2019 15:47:33
Zo zou de prijs ook over tijd kunnen veranderen. Dit zou ook inhouden dat omzet uit het verleden ineens meer of minder zou kunnen worden.
De normale huidige prijs van producten wordt ook in een assortiment tabel opgeslagen. Dit betreft echt de verkochte producten per opdracht. Dus als later de prijs verandert, blijft het per opdracht uit het verleden gewoon kloppen.
Voorbeeld:
Opdracht 1 [tabel varianten]
- Datum: 2018-12-31 (soort = 0) [tabel varianten_datums]
-- 1x Product A a € 20,00 = € 20 [tabel varianten_inhoud]
-- 3x Product B a € 10,00 = € 30 [tabel varianten_inhoud]
- Datum: 2018-12-31 (soort = 1) [tabel varianten_datums]
-- 1x Product C a € 15,50 = € 15,50 [tabel varianten_inhoud]
- Datum: 2019-01-01 (soort = 1) [tabel varianten_datums]
-- 1x Product C a € 15,50 = € 15,50 [tabel varianten_inhoud]
Subtotaal: € 81,00
Korting: € 6,00 (staat dus in tabel varianten)
Totaal: € 75,00
Ik wil dus voor de maand december (€20 + €30 + € 15,50) - €6 = €59,50 en voor januari €15,50