Bedrag per maand weergeven
Hoe kan ik een bedrag per maand weergeven. Als voorbeeld:
Januari: 10,00
Februari: 12,00
Maart: 9,00
etc.
Ik heb als tabel 'omzet'
omzet_id [int 2]
datum [date]
bedrag dec[7,2]
Januari: 10,00
Februari: 12,00
Maart: 9,00
etc.
Ik heb als tabel 'omzet'
omzet_id [int 2]
datum [date]
bedrag dec[7,2]
Ik ga er vanuit dat je een soort query wilt opbouwen? In MySQL?
Dit doe je door de bedragen op te tellen (met SUM()) en te groeperen (met GROUP BY) op grond van de maand. Er bestaan functies in MySQL voor het uitlezen van o.a. het maanddeel en het jaardeel van een datum (DATE) veld.
Zoiets dus:
Dit kan mogelijk nog verder geoptimaliseerd worden. Maar dit is in ieder geval iets dat het gewenste resultat heeft waarschijnlijk.
Dit doe je door de bedragen op te tellen (met SUM()) en te groeperen (met GROUP BY) op grond van de maand. Er bestaan functies in MySQL voor het uitlezen van o.a. het maanddeel en het jaardeel van een datum (DATE) veld.
Zoiets dus:
Code (php)
1
2
3
4
2
3
4
SELECT MONTH(datum) AS maand, SUM(bedrag) AS totaal
FROM omzet
WHERE YEAR(datum) = 2016
GROUP BY maand
FROM omzet
WHERE YEAR(datum) = 2016
GROUP BY maand
Dit kan mogelijk nog verder geoptimaliseerd worden. Maar dit is in ieder geval iets dat het gewenste resultat heeft waarschijnlijk.
Gewijzigd op 19/02/2016 15:08:55 door Thomas van den Heuvel
Oke dat bedoelde ik ook maar kan ik nu ook op een manier op mijn pagina neerzetten:
De omzet van januari is en verder op de omzet van december?
De omzet van januari is en verder op de omzet van december?
In het geval van de query van Thomas:
Oke alleen krijg ik nu:
1 - 15,-
2 - 30,-
4 - 10,-
5 - 12,-
9 - 12,-
Alleen hoe kan ik in mijn document op een bepaalde plek het totaal van december krijg.
1 - 15,-
2 - 30,-
4 - 10,-
5 - 12,-
9 - 12,-
Alleen hoe kan ik in mijn document op een bepaalde plek het totaal van december krijg.
De eerdergenoemde query levert trouwens (inderdaad) geen resultaten op voor maanden dat er geen omzet was. Nu zou je deze ruimte (jan-dec) kunnen opspannen in de query zelf, wat volgens database-puristen mogelijk een betere oplossing is (?), maar dit is iets wat je ook in PHP kunt regelen.
Ik ga meestal voor de verdeel-en-heers strategie, te meer om e.e.a. leesbaar te houden. Je zou de resultaten onder kunnen brengen in een eenvoudige data-structuur, bijvoorbeeld een array. Deze zou je zo complex kunnen maken als je wilt. Een eenvoudige variant is bijvoorbeeld:
Het bovenstaande kan als initialisatie dienen. Als je de query uitvoert kun je de omzet van een specifieke maand uit een databaseresultaat in dit array overschrijven. Het weergeven van de omzet van een specifieke maand komt dan neer op het uitlezen van de tweede array-waarde van een maand (met index 1, want je nummert indices vanaf 0), dus voor december:
Je zou ook nog kunnen overwegen om het array te voorzien van een extra dimensie voor jaartal, en de maand-arrays te voorzien van "keys" in plaast van indexen, zodat je een wat leesbaardere variant hebt. Zoals ik al zei, je kunt het zo uitgebreid maken als je wilt.
EDIT: Als je enkel geinteresseerd bent in de omzet van een specifieke maand zou je natuurlijk ook je query hierop aan kunnen passen met WHERE ... MONTH(datum) = 12. Indien de query dan geen resultaten oplevert, is er geen omzet voor die maand.
Ik ga meestal voor de verdeel-en-heers strategie, te meer om e.e.a. leesbaar te houden. Je zou de resultaten onder kunnen brengen in een eenvoudige data-structuur, bijvoorbeeld een array. Deze zou je zo complex kunnen maken als je wilt. Een eenvoudige variant is bijvoorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$omzet = array(
// index: maandnummer
1 => array('januari', 0), // eerste positie: maandnaam, tweede positie: omzet voor die maand
2 => array('februari', 0),
3 => array('maart', 0),
4 => array('april', 0),
5 => array('mei', 0),
6 => array('juni', 0),
7 => array('juli', 0),
8 => array('augustus', 0),
9 => array('september', 0),
10 => array('oktober', 0),
11 => array('november', 0),
12 => array('december', 0)
);
?>
$omzet = array(
// index: maandnummer
1 => array('januari', 0), // eerste positie: maandnaam, tweede positie: omzet voor die maand
2 => array('februari', 0),
3 => array('maart', 0),
4 => array('april', 0),
5 => array('mei', 0),
6 => array('juni', 0),
7 => array('juli', 0),
8 => array('augustus', 0),
9 => array('september', 0),
10 => array('oktober', 0),
11 => array('november', 0),
12 => array('december', 0)
);
?>
Het bovenstaande kan als initialisatie dienen. Als je de query uitvoert kun je de omzet van een specifieke maand uit een databaseresultaat in dit array overschrijven. Het weergeven van de omzet van een specifieke maand komt dan neer op het uitlezen van de tweede array-waarde van een maand (met index 1, want je nummert indices vanaf 0), dus voor december:
Je zou ook nog kunnen overwegen om het array te voorzien van een extra dimensie voor jaartal, en de maand-arrays te voorzien van "keys" in plaast van indexen, zodat je een wat leesbaardere variant hebt. Zoals ik al zei, je kunt het zo uitgebreid maken als je wilt.
EDIT: Als je enkel geinteresseerd bent in de omzet van een specifieke maand zou je natuurlijk ook je query hierop aan kunnen passen met WHERE ... MONTH(datum) = 12. Indien de query dan geen resultaten oplevert, is er geen omzet voor die maand.
Gewijzigd op 19/02/2016 16:02:53 door Thomas van den Heuvel
Ipv MONTH(datum) uit het voorbeeld van Thomas kun je ook MONTHNAME(datum) gebruiken.
Als je dan ook deze query uitvoert na het opzetten van de connectie, dan krijg je ook de maand in het Nederlands: $query = "SET lc_time_names = 'nl_NL'";
Als je dan ook deze query uitvoert na het opzetten van de connectie, dan krijg je ook de maand in het Nederlands: $query = "SET lc_time_names = 'nl_NL'";
Er zijn meerdere invullingen denkbaar voor het weergeven van een maandnaam, maar dat lijkt mij in dit vraagstuk bijzaak. Wanneer je de data in enige vorm uit je database kunt toveren kun je nog altijd schuiven met de formattering een weergave hiervan.
De vraag is of je dit in je query zelf wilt regelen. Ikzelf vind het fijner om dit elders te doen, omdat je, als je dan besluit om iets in de weergave te veranderen, je je query doorgaans niet hoeft aan te passen (dit valt wat mij betreft onder separation of concerns).
Je bent natuurlijk vrij om alles direct te regelen in je query en dit dan ook elke keer hier te veranderen indien je de weergave wilt aanpassen.
De vraag is of je dit in je query zelf wilt regelen. Ikzelf vind het fijner om dit elders te doen, omdat je, als je dan besluit om iets in de weergave te veranderen, je je query doorgaans niet hoeft aan te passen (dit valt wat mij betreft onder separation of concerns).
Je bent natuurlijk vrij om alles direct te regelen in je query en dit dan ook elke keer hier te veranderen indien je de weergave wilt aanpassen.




