Tellen aantal levende personen in een decennium
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)
1
2
3
4
5
6
7
8
9
10
11
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
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
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...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
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
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
In het geval dat je aaneengesloten reeks wilt hebben kan die ook generen uit de tabel maar dan via een uservar:
Code (php)
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
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
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
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
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