MySQL SELECT met CASE / SUM voor korting
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.
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?
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
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)
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?
Gewijzigd op 07/02/2019 15:21:28 door Ramon van Dongen
Hoe sla je die korting op? Is dat in procenten (0..100), of een vast bedrag, of ...
In de SELECT kun je gewoon rekenen met de waarden uit de gejoinde tabellen.
In de SELECT kun je gewoon rekenen met de waarden uit de gejoinde tabellen.
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.
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.
Hoi Rob,
Bedankt voor je snelle reactie.
De korting is een vast bedrag (decimal).
Werkt in elk geval niet. Bedragen kloppen dan niet.
Toevoeging op 07/02/2019 15:56:40:
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
Bedankt voor je snelle reactie.
De korting is een vast bedrag (decimal).
Code (php)
1
2
3
2
3
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
...
(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.
Toevoeging op 07/02/2019 15:56:40:
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
Gewijzigd op 07/02/2019 16:00:25 door Ramon van Dongen
En als je korting als een speciaal soort product behandelt?
Dat zou kunnen, maar met de huidige database opzet zou ik het dan aan een bepaalde datum toe moeten voegen.
Uit de eerdere query werd een array samengesteld waarmee grafieken en tabellen per maand en kwartaal werden gemaakt.
Ik heb nu een tweede query gemaakt die nogmaals door de eerder gemaakte array loopt om de korting eraf te halen. Dat werkt goed en snel.
Dus dan maar even met 2 querys.
Uit de eerdere query werd een array samengesteld waarmee grafieken en tabellen per maand en kwartaal werden gemaakt.
Ik heb nu een tweede query gemaakt die nogmaals door de eerder gemaakte array loopt om de korting eraf te halen. Dat werkt goed en snel.
Dus dan maar even met 2 querys.




