Tellen aantal levende personen in een decennium

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

George van Baasbank

George van Baasbank

16/03/2013 16:30:55
Quote Anchor link
Hallo allemaal,

Ten behoeve van een lijngrafiek wil ik op mijn database een query uitvoeren met een telling van het aantal LEVENDE personen in dat decennium.
In onderstaande query lukt mij dat voor een groot deel maar deze query toont het aantal geborenen per decennium. Maar bijna iedereen leeft langer dan zijn/haar geboortemoment.
Hoe breid ik deze query nu uit zodat ik per decennium het aantal levende personen krijg?

Even voor de goede orde:
begi_datec is de geboortedatum,
end_datec is de overlijdensdatum en
sex is het geslacht

De huidige query (die qua syntax welk werkt maar nog niet het juiste resultaat geeft)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
select
   count(iid) as aantal,
   substr(begi_datec,1,3) as decennium,
   sex as geslacht
from
   ftphp__indi
where
   begi_datec != 0 and end_datec != 0
group by
   substr(begi_datec,1,3),
   sex



George
Gewijzigd op 16/03/2013 16:38:19 door George van Baasbank
 
PHP hulp

PHP hulp

18/11/2024 01:11:13
 
Eddy E

Eddy E

16/03/2013 16:38:26
Quote Anchor link
Hoe ziet de database (met een paar voorbeeld-getallen) eruit van alle mensen van een decennium lang?
Ben ik wel benieuwd naar.
Kijken of mijn over-over-over-over-over-over-overgroot-moeder er ook in staat.
Vooral omdat er in het jaar 1000 nog niet echt veel registratie wereldwijd was...
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

16/03/2013 21:30:14
Quote Anchor link
Dat wordt een leuke query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT
    d.decennium,
    i.sex,
    COUNT(i.iid) aantal
FROM
    (SELECT DISTINCT
        SUBSTR(begi_datec,1,3) decennium
    FROM
        ftphp__indi
    WHERE
        begi_datec != 0 and end_datec != 0
    ORDER BY decennium
    ) d
JOIN
    ftphp__indi i
    ON
        substr(i.begi_datec, 1, 3) = d.decennium
    OR
        substr(i.end_datec, 1, 3) = d.decennium
    OR
        d.decennium BETWEEN substr(i.begi_datec, 1, 3) AND substr(i.end_datec, 1, 3)
GROUP BY
    d.decennium,
    i.sex
Gewijzigd op 16/03/2013 21:45:15 door Ger van Steenderen
 
George van Baasbank

George van Baasbank

17/03/2013 09:21:30
Quote Anchor link
Ger,
Bedankt voor je meedenken. Eerst even lekker onder de douche en daarna de query uitproberen.
Ik houd je op de hoogte.
George

Toevoeging op 17/03/2013 10:41:31:

Ger,

De query lijkt te werken alleen is het nog jammer dat er, indien er geen geboortes zijn in een bepaald decennium, gaten vallen in de getoonde decennia.
Het lijkt er op dat, als ik dat wil, een start- en einddecennium moet meegeven die dan steeds in de query met één moet worden opgehoogd.

Mocht je belangstelling hebben voor de tabel, hij is nog niet zo heel erg groot, dan kan ik je hem wel doen toekomen.

In ieder geval bedankt voor deze aanzet.


George
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

17/03/2013 13:19:30
Quote Anchor link
George,

In het geval dat je aaneengesloten reeks wilt hebben kan die ook generen uit de tabel maar dan via een uservar:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SELECT
    d.decennium,
    i.sex,
    COUNT(i.iid) aantal
FROM
    (SELECT
    @decade := @decade + 1 decennium
    FROM
        ftphp__indi,
    (SELECT @decade := (SELECT MIN(SUBSTR(begi_datec,1,3)) - 1 FROM ftphp__indi)) uvar
    WHERE
        @decade < SUBSTR(CURDATE(), 1, 3)
    ) d
LEFT JOIN
    ftphp__indi i
    ON
        substr(i.begi_datec, 1, 3) = d.decennium
    OR
        substr(i.end_datec, 1, 3) = d.decennium
    OR
        d.decennium BETWEEN substr(i.begi_datec, 1, 3) AND substr(i.end_datec, 1, 3)
GROUP BY
    d.decennium,
    i.sex
ORDER BY
    d.decennium

Merk op dat er nu een LEFT JOIN staat!
Gewijzigd op 17/03/2013 19:17:51 door Ger van Steenderen
 
George van Baasbank

George van Baasbank

17/03/2013 13:51:06
Quote Anchor link
Ik begrijp dat je nu een beginvariabele nodig hebt om een start te kunnen maken.
Als ik een variabele opneem als $decade = 169 dan wordt er niets getoond.
Declareer ik de variabele wel goed in deze?
Als ik jouw voorbeeld direct in phpMyAdmin draai dan krijg ik geen goed resultaat. Twee keer een decenium 0 (nul) en drie regels met de decennia 1,2, en 3
De typefout uit jouw query heb ik hersteld als ftphp__indi i.p.v. ftphp__iid (regel 10)

George
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

17/03/2013 19:07:01
Quote Anchor link
Er stond een haakje verkeerd op regel 10, verander dit in:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
(SELECT @decade := (SELECT MIN(SUBSTR(begi_datec,1,3)) - 1 FROM ftphp__indi)) uvar
 
George van Baasbank

George van Baasbank

18/03/2013 10:17:19
Quote Anchor link
Ger,

Ik krijg de query nog niet (goed) werkend maar ik denk dat ik er niet veel tijd meer aan ga besteden omdat "mijn probleem" zich vanzelf oplost als er meer personen in de database terecht komen.
Op dit moment heb ik een goede grafische weergave van het aantal levende personen per decennium.
Alvast bedankt.

Topic gesloten


George
 



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.