IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Classer des personnes par tranche d'âge


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 63
    Points : 42
    Points
    42
    Par défaut Classer des personnes par tranche d'âge
    Bonjour,
    Je cherche le code sql qui me permettrait de classer par tranche d'age un fichier de patients de 4000 entrées.
    Travaillant entre autre sous Access(à la maison), j'ai posé cette même question. Des solutions qui marchent très bien m'ont été proposé, mais sont limitées à Access. N'ayant pas Access sur mon lieu de travail je cherche comment faire.

    J'ai également consulté la discussion http://www.developpez.net/forums/d22...lation-classe/.
    La réponse de SQLpro le 27/10/2006 08h49 me laisse un peu perplexe.
    Pouvez vous me traduire votre réponse ?
    Avec mes remerciements.

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Je vais supposer que tu dispose d'une table Patients(IDpatient, Age). Il y a alors deux hypothèses :

    1. soit les tranches d'âges sont régulières et peuvent se calculer mathématiquement (par ex. 0-9 ans, 10-19, 20-29, etc.)
    2. soit elles ne le sont pas, et il faut stocker leur définition dans une table


    Dans l'hypothèse 1, il suffit évidemment d'utiliser la formule de calcul des tranches.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT P.*, FLOOR(Age / 10) * 10 AS Tranche_Age
    FROM Patients
    Dans l'hypothèse 2, il faut créer une table Tranches_Age :
    Lib Mini Maxi
    ------------
    Bébés 0 5
    Enfants 6 13
    Ados 14 17
    Jeunes 18 25
    ...
    Ensuite, il faut faire une jointure BETWEEN entre les patients et les tranches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *, TA.Lib AS Tranche_Age
    FROM Patients P
      INNER JOIN Tranches_Age TA ON P.Age BETWEEN TA.Mini AND TA.Maxi
    Si tu n'as pas l'âge mais la date de naissance (ce qui serait plus normalisé), merci de préciser ton SGBD afin qu'on voit comment calculer l'âge à partir de la date de naissance.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    Antoun, il y a une erreur dans ton modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Libelle    Mini    Maxi
    ---------- ------- --------
    Bébés      0       5
    Enfants    6       13
    Ados       14      17
    Jeunes     18      25
    Cette table possède une colonne redondante susceptible d'entraîner des erreurs de saisie. Il faut enlever l'un des deux colonnes Mini ou maxi et proposer de la calculer par une vue.

    Voici donc la solution correcte à l'aide d'une table de tranche :

    La table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE T_TRANCHE_TRC
    ( TRC_LIBELLE VARCHAR(16) NOT NULL PRIMARY KEY,
      TRC_MAX     INT NOT NULL CHECK (TRC_MAX >= 0))
    Un jeu d'essais ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO T_TRANCHE_TRC VALUES ('Bébés', 4)
    INSERT INTO T_TRANCHE_TRC VALUES ('Enfants', 14)
    INSERT INTO T_TRANCHE_TRC VALUES ('Ados', 18)
    INSERT INTO T_TRANCHE_TRC VALUES ('Jeunes',  25)
    INSERT INTO T_TRANCHE_TRC VALUES ('Adultes',  65)
    INSERT INTO T_TRANCHE_TRC VALUES ('Séniors',  85)
    INSERT INTO T_TRANCHE_TRC VALUES ('Vieillards',  125)
    La requête, transformable en vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT TCF.TRC_LIBELLE, COALESCE(MAX(TCD.TRC_MAX) + 1, 0) AS TFC_MIN, TCF.TRC_MAX
    FROM   T_TRANCHE_TRC AS TCF
           LEFT OUTER JOIN T_TRANCHE_TRC AS TCD
                ON TCF.TRC_MAX > TCD.TRC_MAX
    GROUP BY TCF.TRC_LIBELLE, TCF.TRC_MAX   
    ORDER BY TFC_MIN
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TRC_LIBELLE      TFC_MIN     TRC_MAX
    ---------------- ----------- -----------
    Bébés            0           4
    Enfants          5           14
    Ados             15          18
    Jeunes           19          25
    Adultes          26          65
    Séniors          66          85
    Vieillards       86          125
    A +

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Ça n'est pas une erreur, mais une dénormalisation volontaire. Sur ce genre de table de paramétrage où les saisies sont rares et confiées à peu d'utilisateurs, je considère que le ratio complexité supplémentaire / sécurité induite est faible et justifie la dénormalisation.

    C'est évidemment un point de vue parfaitement criticable, merci donc pour la solution normalisée !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 63
    Points : 42
    Points
    42
    Par défaut
    Merci pour vos réponse.
    J'ai ainsi pu gérer ma table patient.
    Je travaille sur mysql depuis wamp server2.0
    Concernant l'age de mes patients, j'ai la date de naissance. J'ai fait la difference (date_exam - date_naissance)/365.25
    Cela me donne l'age en année. Je n'ai pas utilisé YEAR qui me semble un tout petit peu moins précis (au 01/01/2001, celui qui est né le 31/12/2000 a déjà un an...).
    Vos réponses me permettent de fermer cette discussion.
    Cordialement.
    Et bonne année 2009 à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Classer des âges par tranches d'âges via un code VBA - Erreur 1004
    Par Estriny dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/12/2014, 21h04
  2. Classer des fichiers par date
    Par lorentdups dans le forum Langage
    Réponses: 3
    Dernier message: 01/10/2006, 17h14
  3. [MySQL] Classer des résultats par ordre alphabétique
    Par Him dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/07/2006, 14h59
  4. Récupérer des enregistrements par tranche horaire
    Par olive_le_malin dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 19/05/2006, 16h53
  5. Classer des messages par date ET par pertinence
    Par pocpoc2 dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 04/07/2005, 10h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo