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 :

Requête: classes d'age


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 147
    Points : 144
    Points
    144
    Par défaut Requête: classes d'age
    Bonjour
    J'ai un problème pour faire une requête:
    J'ai deux tables. Une qui décrit des classes :

    TABLE CLASSES
    NomClasse : Chaine
    AgeMin : Réel
    AgeMax : Réel

    Et une table contenant des personnes, qui ont un age:
    TABLE PERSONNE
    NomPersonne : Chaine
    Age : Entier

    Je n'arrive pas, sous access (au fond peu importe le sgbd), a obtenir en résultat de requête de sélection:
    NomPersonne NomClasse

    Voici le texte de la requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT NomPersonne, Age, IIf([age]<[agemax] And [age]>=[agemin],[NomClasse],"Classe Inconnue") AS ["Classe d'âge"]
    FROM PERSONNE, CLASSES
    GROUP BY  NomPersonne, Age, IIf([age]<[agemax] And [age]>=[agemin],[NomClasse],"Classe Inconnue") AS ["Classe d'âge"]
    Le problème est que les lignes de résultat sont doublées. Une ligne avec la vraie classe d'âge et une ligne avec la classe "Classe Inconnue"
    Avez vous une idée???
    MErci

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    tu peux donner un exemple minimal ?

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 147
    Points : 144
    Points
    144
    Par défaut oui
    je vais essayer

    voici le contenu de la table CLASSES
    Pour mémoire, la structure:
    NomClasse : Chaine
    AgeMin : Réel
    AgeMax : Réel

    Contenu de la table (les valeurs sont séparées par des point virgule)
    Jeune Personne; 0 ; 10
    Adolescent ; 11 ; 18
    Adulte ; 19 ; 45

    et la table Personne:
    NomPersonne : Chaine
    Age : Entier

    Contenu de la table personne:
    Robert ; 5
    Patrick ; 16
    Michel ; 50
    Arthur ; 17


    Le résultat de la requête devrait donner ça:
    Robert ; Jeune Personne
    Patrick ; Adolescent
    Michel ; Inconnu
    Arthur ; Adolescent


    Est ce clair?

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Il vaudarit mieux faire une jointure externe entre Personnes et Classes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    on Age< agemax AND age >= agemin

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Je ne dispose pas du même SGBD que toi (j'ai Interbase 6) car IIF n'existe pas mais je te propose la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT P.*, CASE WHEN ( SELECT C.NOMCLASSE
                            FROM CLASSE C
                            WHERE P.AGE BETWEEN C.AGEMIN AND C.AGEMAX ) IS NULL
                     THEN 'Classe inconnue'
                     ELSE ( SELECT C.NOMCLASSE
                            FROM CLASSE C
                            WHERE P.AGE BETWEEN C.AGEMIN AND C.AGEMAX )
                END AS Classedage
    FROM PERSONNE P;
    Ceci dit, d'après ce que j'ai lu jusqu'à maintenant la syntaxe CASE est assez gourmande donc à éviter .

  6. #6
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    bonjour,

    Le problème est que les lignes de résultat sont doublées. Une ligne avec la vraie classe d'âge et une ligne avec la classe "Classe Inconnue"
    Avez vous une idée???
    Oui. Il semble qu'il manque la jointure entre tes 2 tables dans ta rq.
    Ca, ça devrait te donner le bon résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select 	personne.nompersonne,
    	case when classe.nomclasse is null then 'inconnu' else classe.nomclasse end as nomclasse
    from 	personne
    left join classe
    on personne.age between classe.agemin and classe.agemax;
    à +,

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par TheLeadingEdge
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    on personne.age between classe.agemin and classe.agemax;
    Non pas BETWEEN car la borne supérieure est exclue, je persiste et signe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON Age< agemax AND age >= agemin

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par Médiat
    Citation Envoyé par TheLeadingEdge
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    on personne.age between classe.agemin and classe.agemax;
    Non pas BETWEEN car la borne supérieure est exclue, je persiste et signe :
    mais alors pour toi à quelle classe appartiendrait le nouvel enregistrement suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO PERSONNE VALUES ('patrice', 18);
    D'après ma requête et c'est bien ce résultat que j'attends, il s'agit de 'Adolescent'

  9. #9
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    re,
    Citation Envoyé par Médiat
    Non pas BETWEEN car la borne supérieure est exclue, je persiste et signe :
    oups, mea culpa, j'ai lu trop vite la rq de sbeu.
    Voici donc la correction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select 	personne.nompersonne,
    	case when classe.nomclasse is null then 'inconnu' else classe.nomclasse end as classe
    from 	administrateur.classedage_personne as personne
    left join administrateur.classesdage_classe as classe
    on personne.age < classe.agemax and age >= classe.agemin;
    Mais ça me laisse 1 doute quant à la justesse du résultat. Puisque les bornes inférieures et supérieures ne se recoupent pas. Les personnes qui ont l'age de la borne max. vont se retrouver 'inconnu'.

  10. #10
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Magnus >> En fait sbeu donne deux informations contradictoires

    Mer Sep 14, 2005 17:15 :
    IIf([age]<[/size][agemax] And [age]>=[agemin],[NomClasse] ce qui a motivé ma réponse

    Mer Sep 14, 2005 17:37
    Les exemples donnés ont des bornes exclusives

    Toi et TheLeadingEdge avez raison vis à vis du deuxième post et tort vis à vis du premier
    J'ai raison vis à vis du premier post et tort vis à vis du deuxième
    Je n'ai qu'une chose à ajouter :

  11. #11
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 147
    Points : 144
    Points
    144
    Par défaut Merci les gars.
    Merci à tous.
    Je vais essayer ça. j'espère que les CASE ou que les jointures > et < fonctionneront sous ACCESS... Je suis dans un moteur Jet, malheuresement. Je sais que SQLServer ça marche. je vais voir ça.
    Quant aux problèmes de borne, j'arrangerai ça.
    Encore une fois, merci à tous.

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

Discussions similaires

  1. Creer des classe d'age
    Par ratatam25 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 23/12/2008, 23h05
  2. Requête sur classe mère
    Par Galak extra dans le forum Hibernate
    Réponses: 7
    Dernier message: 22/08/2008, 16h19
  3. [MySQL] Requête "classe, etudiant et couleur"
    Par lex_22 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/05/2008, 00h38
  4. classe ado requête parametrée
    Par jadey dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 09/05/2007, 00h32

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