@Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
la tu dois faire des efforts pour trouver le reste
Bon nuit![]()
-
Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !Rejeter la notice
calculer le nombre de personne par tranche d'age
Discussion dans 'Résolution problème & conseils' créé par elhacene, Avr 5, 2018.
Je viens de faire des tests avec une table de 20 000 clients récupérés sur randomuser.me.
Et le mieux que j'ai pu faire en une seule fois, le voici :
SELECT '10_20' AS tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(LEFT(WL.Age(DateNaissance), 4) AS INTEGER) BETWEEN 10 AND 20
UNION SELECT '21_30' AS tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(LEFT(WL.Age(DateNaissance), 4) AS INTEGER) BETWEEN 21 AND 30
UNION SELECT '31_40' AS tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(LEFT(WL.Age(DateNaissance), 4) AS INTEGER) BETWEEN 31 AND 40
UNION SELECT '41_50' AS tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(LEFT(WL.Age(DateNaissance), 4) AS INTEGER) BETWEEN 41 AND 50
UNION SELECT '51_60' AS tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(LEFT(WL.Age(DateNaissance), 4) AS INTEGER) BETWEEN 51 AND 60
UNION SELECT '60+' AS tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(LEFT(WL.Age(DateNaissance), 4) AS INTEGER) > 60
Résultat en 2s 17 pour 20 000 dates de naissance (le compte est bon) :
J'ai fait un autre test en utilisant MONTHS_BETWEEN à la place de la fonction Age :Code (Text):
Enr tranche total
1 21_30 3333
2 31_40 3947
3 41_50 3852
4 51_60 3944
5 60+ 4924
SELECT '10_20' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 10 AND 20
UNION SELECT '21_30' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 21 AND 30
UNION SELECT '31_40' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 31 AND 40
UNION SELECT '41_50' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 41 AND 50
UNION SELECT '51_60' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 51 AND 60
UNION SELECT '60+' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) > 60
Le résultat est toujours en dessous des 2s pour 20 000 dates, donc plus rapide, mais d'un rien.
rafik19, joker, elhacene et 1 autre personne aiment ça.
Good job, bravo
Bon travail Freud
bon développement.
@Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
la tu dois faire des efforts pour trouver le reste
Bon nuitCliquez pour agrandir...

Je viens de faire des tests avec une table de 20 000 clients récupérés sur randomuser.me.
Et le mieux que j'ai pu faire en une seule fois, le voici :
SELECT '10_20' AS tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(LEFT(WL.Age(DateNaissance), 4) AS INTEGER) BETWEEN 10 AND 20
UNION SELECT '21_30' AS tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(LEFT(WL.Age(DateNaissance), 4) AS INTEGER) BETWEEN 21 AND 30
UNION SELECT '31_40' AS tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(LEFT(WL.Age(DateNaissance), 4) AS INTEGER) BETWEEN 31 AND 40
UNION SELECT '41_50' AS tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(LEFT(WL.Age(DateNaissance), 4) AS INTEGER) BETWEEN 41 AND 50
UNION SELECT '51_60' AS tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(LEFT(WL.Age(DateNaissance), 4) AS INTEGER) BETWEEN 51 AND 60
UNION SELECT '60+' AS tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(LEFT(WL.Age(DateNaissance), 4) AS INTEGER) > 60
Résultat en 2s 17 pour 20 000 dates de naissance (le compte est bon) :
J'ai fait un autre test en utilisant MONTHS_BETWEEN à la place de la fonction Age :Code (Text):
Enr tranche total
1 21_30 3334
2 31_40 3947
3 41_50 3851
4 51_60 3944
5 60+ 4924
SELECT '10_20' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 10 AND 20
UNION SELECT '21_30' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 21 AND 30
UNION SELECT '31_40' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 31 AND 40
UNION SELECT '41_50' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 41 AND 50
UNION SELECT '51_60' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 51 AND 60
UNION SELECT '60+' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) > 60
Le résultat est toujours en dessous des 2s pour 20 000 dates, donc plus rapide, mais d'un rien.Cliquez pour agrandir...
dit moi
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
j'ai implante ton code dans windev ! et moi je travail toujours avec des requet graphique alors si je suis sur la bonne voie
j'ai essayé de crée une nouvel requet avec codeSql dans l'assistant de windev puis j'ai collé ton code j'ai u une erreur deBonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
Tu es tombé sur le bug de WD20 avec WL.Age, si tu utilises toujours WD20, tu devrais prendre la seconde requête avec MONTHS_BETWEEN :
SELECT '10_20' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 10 AND 20
UNION SELECT '21_30' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 21 AND 30
UNION SELECT '31_40' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 31 AND 40
UNION SELECT '41_50' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 41 AND 50
UNION SELECT '51_60' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 51 AND 60
UNION SELECT '60+' as tranche,COUNT(idclient) AS total FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) > 60
Aaahh les veilles versions, les agrégations n’était pas aussi souples que maintenant, la solution serait de sortir le texte de l’agrégat, mais j'ai plus simple encore.
Au lieu d'avoir le résultat en colonne, tu auras le résultat en ligne, comme ça il n'en manquera pas :
SELECT (SELECT COUNT(idclient) FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 10 AND 20) AS TR10_20
,(SELECT COUNT(idclient) FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 21 AND 30) AS TR21_30
,(SELECT COUNT(idclient) FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 31 AND 40) AS TR31_40
,(SELECT COUNT(idclient) FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 41 AND 50) AS TR41_50
,(SELECT COUNT(idclient) FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 51 AND 60) AS TR51_60
,(SELECT COUNT(idclient) FROM client_20000 WHERE CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) > 60) AS TR60
Le résultat en colonne 1 : 10/20, 2 : 21/30 ... :
Maintenant, on a les tanches à 0.Code (Text):TR10_20 TR21_30 TR31_40 TR41_50 TR51_60 TR60
0 3333 3947 3852 3944 4924
rafik19, Kill3rbko, joker et 1 autre personne aiment ça.
Peut être une idée vue sur le net.A partir de l'âge que tu as calculé,
tu divises l'age par 10 en ne gardant que la partie entière.
(0 à 9 donne 0, 10 à 19 donne 1, ..., 100 à 109 donne 10
SELECT CAST((age / 10) AS INTEGER) AS tranche
ou
select
Count(IIf([naissance_adh] Between #01/01/1950# And #31/12/1959#,[naissance_adh])) AS [50-59],
Count(IIf([naissance_adh] Between #01/01/1960# And #31/12/1969#,[naissance_adh])) AS [60-69]
from adherents
elhacene apprécie ceci.
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
Oui, la partie de division par 10 est le cas où (comme dans mon exemple) on a besoin des tranches par 10,
mais si tu veux le pourcentage des mineurs, soit < 18, autant rester sur saisie des tranches.
Pour la version conditionnelle, ta version est pour calculer les personnes nées dans les années 50 et 60.
L'idée est bonne en la traduisant pour nous, mais HFSQL en agrégat conditionnelle, il faut que je regarde,
mais je ne pense pas qu'ils en sont encore là, les deux en même temps ne doit pas fonctionner, mais je peux me tromper.
Ce serait du genre :
SELECT COUNT(CASE WHEN CAST(MONTHS_BETWEEN(SYSDATE,DateNaissance)/12 AS INTEGER) BETWEEN 20 AND 30 THEN 1 ELSE NULL END) FROM client_20000
Mais ça ne fonctionne pas.
Édit :
Sur la version 20 de notre cher ami, mais je vais tester sur la 23.
Édit 2 :
Je confirme, ça ne fonctionne pas aussi sur la 23, en tout cas sous cette forme.
elhacene apprécie ceci.
Je confirme, ça ne fonctionne pas aussi sur la 23
Bon travail Freud