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 :

problème de Requête sous Access


Sujet :

Langage SQL

  1. #1
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut problème de Requête sous Access
    Bonjour à tous

    Je développe actuellement un logiciel en C++ qui attaque une base de données Access. Jusque là pas de problème

    J'essaye dans une boite de dialogue d'afficher un DBGrid avec la liste des Groupes que j'ai créé ainsi que le nombre de Patient présent dans chaque groupe.

    Voici la structure des deux tables de ma base de données utilisée dans cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Table Groupe : idGroupe, Groupe)
    Table Patient : idPatient, Nom, Prénom, ...., GroupePatient, .......)
    ou GroupePatient est une clé étrangère pointant sur la table Groupe (idGroupe)
    Voici la requête que j'exécute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT idGroupe, Groupe, (SELECT COUNT(*) FROM Patient, Groupe WHERE GroupePatient = idGroupe) AS NbPatient FROM Groupe
    Sauf qu'elle me renvoit dans NbPatient pour chaque groupe non pas le nombre de Patient de chaque groupe mais le Nombre de Patient Total

    Qu'est ce qui ne vas pas dans ma requête à votre avis

    Merci d'avance pour votre aide

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 394
    Points
    28 394
    Par défaut
    L'erreur est là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (SELECT COUNT(*) FROM Patient, Groupe WHERE GroupePatient = idGroupe)

  3. #3
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Merci pour ta réponse al1_24
    Mais je ne comprend pas ce que tu me proposes car c'est déjà présent dans ma requête ???

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Il faut corréler la sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT g.idGroupe, g.Groupe, 
           (SELECT COUNT(*) FROM Patient p WHERE p.GroupePatient = g.idGroupe) AS NbPatient 
      FROM Groupe g
    Ou passer par une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select g.idGroupe, g.Groupe, count(*) as NbPatient
      from groupe g
      left join patient p on p.GroupePatient = g.idGroupe
     group by g.idGroupe, g.Groupe

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 394
    Points
    28 394
    Par défaut
    Ton problème démontre l'utilité de qualifier toutes les colonnes d'une requête parle nom (ou l'alias) de la table à laquelle elles se réfèrent.
    Si tu l'avais fait, ton erreur t'aurait sauté aux yeux et tu ne te serais pas posé de question.
    Réécrivons la requête en qualifiant les colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  grp.idGroupe
        ,   grp.Groupe
        ,   (   SELECT  COUNT(*) 
                FROM    Patient pat
                    ,   Groupe  gp2
                WHERE   pat.GroupePatient = (grp ou gp2?).idGroupe
            )   AS NbPatient
    FROM    Groupe  grp
    Est-ce que l'utilisation de la table Groupe dans la sous-requête se justifie ?

  6. #6
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Merci à vous deux pour vos réponses

    Pour skuatamad
    Nickel, les deux requêtes me donne ce que je veux mais je t'avoue que pour la deuxième, je suis un peut rouillé pour arriver à la sortir de moi-même

    J'ai d'ailleurs fait quelques test de mon côté avec l'aide d'une amie et voilà ce que nous avons obtenus et qui fonctionne aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT idGroupe, Groupe, 
     COUNT(GroupePatient) AS NbPatient 
    FROM Patient, Groupe
     WHERE GroupePatient = idGroupe
    GROUP BY idGroupe, Groupe
    Pour al1_24
    Les deux ne fonctionne pas correctement
    La première avec grp me double le nombre de Patient dans chaque groupe
    La seconde avec grp2 me demande de saisir IdGroupe

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 394
    Points
    28 394
    Par défaut
    Citation Envoyé par kurul1 Voir le message
    Pour al1_24
    Les deux ne fonctionnent pas correctement
    La première avec grp me double le nombre de Patient dans chaque groupe
    La seconde avec grp2 me demande de saisir IdGroupe
    Je n'ai pas cherché à te fournir une requête qui fonctionnait, j'ai juste essayé de mettre en évidence pourquoi ta requête ne fonctionnait pas afin que tu puisses comprendre comment la corriger.
    PS : Pour la seconde, je n'ai pas écrit grp2 mais gp2, ce qui explique pourquoi Access te demande de saisir IdGroupe.

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    et voilà ce que nous avons obtenus et qui fonctionne aussi
    Tu as fait une jointure interne, moi une jointure externe.

    Tout dépend du besoin s'il est nécessaire d'afficher les groupes qui n'ont pas de patient avec le count(*) à 0 alors il faut utiliser une jointure externe, sinon une jointure interne. Comme tu étais parti sur une requête corrélée, la traduction en jointure est une jointure externe.

  9. #9
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    J'ai bien noté, merci pour les explications skuatamad
    Et effectivement, j'ai besoin que le Count(*) à 0 soit affiché

    Pour al1_24 une faute de frappe de ma part
    Mais j'ai bien compris d'où venait le problème

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

Discussions similaires

  1. [AC-2003] Problème de requête sous access en utilisant les dates
    Par rana dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/03/2010, 10h44
  2. Problème de requête sous Access (passage du SQL à Access)
    Par pep972 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/04/2009, 18h49
  3. Problème de requête sous Access
    Par david71 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/06/2007, 17h47
  4. Problème de requêtes sous Access
    Par guestCam dans le forum Access
    Réponses: 2
    Dernier message: 02/03/2007, 15h56
  5. [SNMP] Problème de requêtes sous Windows
    Par weib dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 30/11/2005, 19h00

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