[MySQL] query voor weergeven data periode

Pagina: 1
Acties:

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 10:56

Pelle

🚴‍♂️

Topicstarter
Momenteel ben ik bezig met een CMS'je dat statistieken moet genereren uit een reeds bestaande tabel met data.

De tabel ziet er zo uit:
code:
1
2
3
4
5
6
7
id    int(11)
training  int(11) 
week    tinyint(4)  
maand     tinyint(4) 
jaar    int(11) 
soort     enum('B','I') 
aantal    int(11)

Het datamodel bestaat dus al en daar kan ik niks aan veranderen. Het houdt in ieder geval bij hoeveel bezoekers ('B') of inschrijvingen ('I') er op een bepaalde training zijn geweest, in een bepaalde week (== weeknummer), een bepaalde maand of een bepaald jaar.

Nu moet ik in dat CMS een overzichtje geven van de bezoekaantallen in een bepaalde periode. Nu is het niet zo moeilijk als de periode hetzelfde jaar bestrijkt, de query wordt dan bijvoorbeeld zoiets: (als er gezocht wordt op een periode tussen 2 maanden (in dit geval februari en april)):
code:
1
2
3
4
5
6
7
8
9
10
SELECT  t.naam,
        sum(s.aantal) AS aantal
FROM      trainingen t,
        trainingen_statistieken s
WHERE    s.maand       >= '2'     AND
        s.maand    <= '4'     AND
        s.jaar       = '2002'  AND
        s.soort     = 'B'     AND
        s.training   = t.id
ORDER BY    aantal DESC

Het wordt alleen vervelend als een periode meerdere jaren gaat beslaan. Ik loop me er echt een beetje blind op te staren. Iemand die een helder idee heeft?

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Uhm je zou misschien een soort casting kunnen doen door van de 3 velden een echte datum te maken en dan uiteindelijk de boel via between gaan filteren.

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 10:56

Pelle

🚴‍♂️

Topicstarter
* Pelle solved. :)

Afhankelijk van het verschil in jaren bouw ik een query. Is het jaar hetzelfde, dan rolt de query eruit die ik hierboven al genoemd heb (met nog een GROUP BY clause die ik was vergeten :o).

Is het verschil groter dan nul jaar, dan gaat 'ie zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT  t.naam,
        sum(s.aantal) AS aantal
FROM      trainingen t,
        trainingen_statistieken s
WHERE     ((s.maand    >= '2'   AND
        s.jaar       = '2002')  OR
         (s.jaar         > '2002'   AND
        s.jaar       < '2005')  OR
         (s.maand      <= '10'     AND
        s.jaar       = '2005')) AND
        s.soort     = 'B'   AND
        s.training   = t.id
GROUP BY    naam
ORDER BY    naam ASC

Stom dat ik daar niet eerder aan gedacht had, m'goed. We zijn eruit :)