MySQL SELECT met CASE / SUM voor korting

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ramon van Dongen

Ramon van Dongen

07/02/2019 15:20:51
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)


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
 
PHP hulp

PHP hulp

29/03/2024 15:00:57
 
Rob Doemaarwat

Rob Doemaarwat

07/02/2019 15:42:07
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

07/02/2019 15:47:33
Quote Anchor link
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.
 
Ramon van Dongen

Ramon van Dongen

07/02/2019 15:48:00
Quote Anchor link
Hoi Rob,

Bedankt voor je snelle reactie.

De korting is een vast bedrag (decimal).

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
...


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
 
Thomas van den Heuvel

Thomas van den Heuvel

08/02/2019 19:25:52
Quote Anchor link
En als je korting als een speciaal soort product behandelt?
 
Ramon van Dongen

Ramon van Dongen

09/02/2019 12:33:43
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.