Vandaag is het alweer al de voettocht wat de klok slaat.

Staan op het lijstje te doen

  • Statistieken
  • Statistieken
  • Driewerf statistieken
  • Website aanpassen
  • Inschrijvingen corrigeren

Wat de eerste drie betreft, is het vrij eenvoudig. Kwestie van de juiste balans te vinden tussen overdaad aan informatie en nuttige gegevens. Ik zou zo pakweg een lijst kunnen maken van de leeftijd per nationaliteit versus de te wandelen afstanden en kijken of dit al dan niet wandelclub gerelateerd is. Een ander probleem is hoe dit geheel nog leesbaar maken.

De statistieken op dit ogenblik zijn

  • Aantal wandelaars per afstand per dag
  • Aantal wandelaars per dag (enkel zaterdag, enkel zondag, volledig weekend) per afstand
  • Aantal wandelaars per leeftijdsgroep (verspringt om de vijf jaar)
  • Aantal wandelaars per nationaliteit (niet per land want dat kan verschillend zijn. Een Noor die in Nederland woont is en blijft een Noor)
  • Aantal wandelaars per wandelclub/groepering en per dag
  • Evolutie sinds 1970 wat het totaal aantal wandelaars betreft.

Het allergrootste probleem bij dergelijke statistieken is RIRO (rommel in, rommel uit). Ook al hebben wij zo veel mogelijk de moeite gedaan om het online inschrijven makkelijker, eenvoudiger en betrouwbaarder te maken, blijven x-aantal individuen er in slagen om nonsense in te vullen.

De grootste uitdaging was de querie om de wandelaars in leeftijdsgroepen te steken; leeftijdsgroepen die verspringen per vijf jaar (om een beetje een leesbaar geheel te hebben).

Hoe berekent een mens nu de leeftijd in blokken van 5 jaar?

Het veld geboortedatum in de tabel wandelaars bevat – leve het zinvol benoemen van velden – de geboortedatum. Een eerste stap is het berekenen van de leeftijd op vandaag.

DATE_FORMAT(NOW(), ‘%Y’) – DATE_FORMAT(geboortedatum, ‘%Y’)

Gewoon het geboortejaar aftrekken van het huidig jaar, zie supra, is een idee maar kan er toch een jaar naast zitten.

Indien de persoon dit jaar nog niet verjaard is, dan is hij nog een jaartje jonger en moeten we er nog een extra jaar van aftrekken.

Kijken of de verjaardag dit jaar al gepasseerd is doen we met de volgende check

(DATE_FORMAT(NOW(), ’00-%m-%d’) < DATE_FORMAT(geboortedatum, ’00-%m-%d’))

Indien dit waar is, dan krijgen we een 1 terug; indien niet een 0. Laat dit nu net de waarde zijn die we moeten verminderen van onze eerste formule. De leeftijdsberekening wordt bijgevolg

DATE_FORMAT(NOW(), ‘%Y’) – DATE_FORMAT(geboortedatum, ‘%Y’) – (DATE_FORMAT(NOW(), ’00-%m-%d’) < DATE_FORMAT(geboortedatum, ’00-%m-%d’))

Afhankelijke van de ingevulde informatie (er komt een heleboel info uit een vorige database waar er niet onmiddellijk aan invoercontrole werd gedaan en, erger nog, er vaak foutieve informatie manu militari moest ingevoerd worden. Die er allemaal uitfilteren is een kwestie van gezond verstand: geboortedata in de toekomst zijn uitgesloten alsook wandelaars van meer dan 99 jaar.

SELECT DATE_FORMAT(NOW(), ‘%Y’) – DATE_FORMAT(geboortedatum, ‘%Y’) – (DATE_FORMAT(NOW(), ’00-%m-%d’) < DATE_FORMAT(geboortedatum, ’00-%m-%d’)) AS ‘Leeftijd’
FROM `wandelaars`
WHERE DATE_FORMAT(NOW(), ‘%Y’) – DATE_FORMAT(geboortedatum, ‘%Y’) BETWEEN 0 AND 100

Nu hebben we van elke wandelaar de leeftijd. De volgende stap is het groeperen van per leeftijd per 5 jaar. Hoe doen we dit? Zorgen we dat het aantal overeenkomt vanaf de ondergrens tot bovengrens of is dit het aantal rond de grens. Even verduidelijken:

Het overzicht toont de grenzen 0, 5, 10, 15, 20, …

Het aantal bij 10, zijn dit het aantal mensen van 10 jaar maar nog geen 15 jaar, of zijn dit het aantal mensen rond 10 jaar? In dit geval kiezen we voor de laatste optie. Hier komt de round() functie vrij handig. De Select wordt

SELECT ROUND(DATE_FORMAT(NOW(), ‘%Y’) – DATE_FORMAT(geboortedatum, ‘%Y’) – (DATE_FORMAT(NOW(), ’00-%m-%d’) < DATE_FORMAT(geboortedatum, ’00-%m-%d’))/5,0)*5 AS ‘Leeftijd’

De leeftijd delen door 5, dit afronden (niet afhakken) en opnieuw maal 5.

Pieter.org - leeftijdsgroepen

Een nieuwe bodem voor discussie is wat te doen met mensen die morgen verjaren en bijgevolg in een andere categorie terecht komen? Gewoon negeren is hier het antwoord!

SELECT ROUND((DATE_FORMAT(NOW(), ‘%Y’) – DATE_FORMAT(geboortedatum, ‘%Y’) – (DATE_FORMAT(NOW(), ’00-%m-%d’) < DATE_FORMAT(geboortedatum, ’00-%m-%d’)))/5,0)*5 AS ‘Leeftijd’
FROM `wandelaars`
WHERE DATE_FORMAT(NOW(), ‘%Y’) – DATE_FORMAT(geboortedatum, ‘%Y’) BETWEEN 0 AND 100

En nu nog tellen. Dit in één grote Select lijkt me niet onmiddelijk mogelijk dus gaan we nesten.

SELECT `Leeftijd`, COUNT(`Leeftijd`) as ‘Aantal’
FROM
  (
  SELECT ROUND((DATE_FORMAT(NOW(), ‘%Y’) – DATE_FORMAT(geboortedatum, ‘%Y’) – (DATE_FORMAT(NOW(), ’00-%m-%d’) < DATE_FORMAT(geboortedatum, ’00-%m-%d’)))/5,0)*5 AS ‘Leeftijd’
  FROM `wandelaars`
  WHERE DATE_FORMAT(NOW(), ‘%Y’) – DATE_FORMAT(geboortedatum, ‘%Y’) BETWEEN 0 AND 100
  ) AS t_wandelaars_leeftijd
GROUP BY `Leeftijd`

En de grafiek, rechtstreeks in Excel dankzij de ODBC driver voor MySQL, ziet er zo uit.

Pieter.org - leeftijdsgroepen grafiek

Vader, echtgenoot, vriend, buur, collega en kennis.
Geen specifieke volgorde, geen enumeratie, "en" keuze lijst.
Voor de rest veel interesse en veel te weinig tijd.

Leave a comment