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

Requêtes et SQL. Discussion :

requêtes imbriqués avec comptage


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut requêtes imbriqués avec comptage
    Bonjour,

    J'ai un problème avec une requete sous ACCESS
    j'ai 2 tables tblClient et tblVisite et je veux que ma requête me retourne pour chaque enregistrement de tblClient le nombre de visite.
    Ce qui me donne cette requête qui fonctionne parfaitement

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT tblClient.IdClient, tblClient.NOM, Count(TblVisite.IdVisite) AS CompteDeIdVisite
    FROM TblVisite RIGHT JOIN tblClient ON TblVisite.IdClient = tblClient.IdClient
    GROUP BY tblClient.IdClient, tblClient.NOM, tblClient.CodeSuppr
    HAVING (((tblClient.CodeSuppr)=False));

    Maintenant je souhaite la modifier
    Dans la table tblVisite j'ai un champ DateVisite et un Champ CodeSuppr

    je souhaite faire la mëme chose que précédement sauf qu'il faut ajouter les conditions
    - tblVisite.CodeSuppr = False
    - tblVisite.DateVisite >= #01/01/07# (par exemple)
    dans le calcul du nombre de visite

    et là j'ai beau faire j'obtiens toujours un résultat vide

    Quelqu'un aurait-il une solution à me proposer ?

    Merci d'avance
    Didier

  2. #2
    Expert éminent sénior

    Avatar de Siguillaume
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2007
    Messages
    6 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 6 180
    Points : 25 358
    Points
    25 358
    Par défaut
    Ok!
    Tout dépend de ce que tu veux faire. Décris ce que tu veux obtenir comme résultat
    ça permettrait peut-être de modifier la structure de ta requête et les champs qui sont concernés

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour

    As-tu essayé avec le QBE ? C'est un super outil.

    Starec

  4. #4
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Précision sur le résultat espéré
    Bonjour,

    En réponse à Danjos, j'explique plus précisément mon problème.

    j'ai 2 tables

    tblClient:
    IdClient (Identifiant unique)
    Nom (Texte)
    CodeSuppr (Vrai si enregistrement supprimé)
    tblVisite:
    IdVisite (Identifiant unique)
    IdClient (lien vers la table tblClient)
    DateVisite
    CodeSuppr (Vrai si enregistrement supprimé)

    je souhaite faire une requête qui me donne

    tblClient.IdClient, tblClient.Nom, NombredeVisite

    • Le nombre de visite est calculé à partir d'une date donnée en paramêtre.
    • Il ne faut surtout pas tenir compte des enregistrements marqués comme supprimés aussi bien dans le nombre de visite que dans la liste des clients.
    • Les clients sans visite dans la période doivent également apparaitre dans la liste.


    J'espère que celà éclaire le problème.

    Merci de votre aide
    Didier

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 350
    Points : 1 701
    Points
    1 701
    Par défaut
    Bonjour,

    La requête étant déjà triée dans la table tblClient par CodeSuppr, de ce fait n'apparaissent pas les visites des clients en relation. Essayer un second trie sur la table visite ne peut qu'apporter des soucis. Rien de bon.
    Pour qu'apparaissent les clients sans visite ça semble découler de la propriété de la jointure.

    Cordialement.

  6. #6
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut
    Salut
    Je pense aussi que cela viens de la jointure.
    Dans le code de ta requete, remplace INNER JOINT par LEFT JOINT. Cela permettra à la requete d'afficher les clients ayant des visites et ceux n'ayant aucun.
    Par ailleur je trouve que l'idée de STAREC est très interessant. Avec qbe (QUERY BY EXAMPLE, le générateure de requete d'ACCESS) tu double-clique sur la liaison des deux tables et tu choix la deuxième option (inserer tous les enregistrements de la table client et ceux de la table visites pour lesquels les champs joints sont égaux) (si ma mémoire est bonne et que je parle français)
    Au fait je ne comprend pas pourquoi garder des enregistrements supprimé
    @+

  7. #7
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour

    et merci de vos suggestions

    Pour ce qui est du QBE je l'ai utilisé pour constituer ma requête de départ et pour essayer d'ajouter le filtre sur CodeSuppr et DateVisite

    Ma première requête sans filtre marche parfaitement
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT tblClient.IdClient, Count(tblVisite.IdVisite) AS CompteDeIdVisite
    FROM tblClient LEFT JOIN tblVisite ON tblClient.IdClient = tblVisite.IdClient
    GROUP BY tblClient.IdClient;

    Malheureusement dès que je veux filtrer sur la date de visite je n'ai plus que les clients ayant fait l'objet d'une visite dans la période.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT tblVisite.IdClient, Count(tblVisite.IdVisite) AS CompteDeIdVisite
    FROM tblClient LEFT JOIN tblVisite ON tblClient.IdClient = tblVisite.IdClient
    WHERE (((tblVisite.DateVisite)>=#10/10/2007#))
    GROUP BY tblVisite.IdClient;

    Pour obtenir le résultat souhaité il faudrait que le filtre sur la date de visite s'applique uniquement sur le Count(IdVisite) et pas sur la jointure mais je n'ai pas trouvé de moyen de faire celà.

    En réponse à alassanediakite
    >Au fait je ne comprend pas pourquoi garder des enregistrements supprimés
    je garde les enregistrements supprimés car la base est destinée à être déployée sur 10 postes nomades distants et à fonctionner sans connection au réseau d'entreprise.
    Régulièrement (1 fois par semaine) chaque utilisateur fait une consolidation sur une base centralisée (par transfert ftp) et la suppression physique des enregistrements marqués supprimés se fait après ce transfert afin que la suppression soit propagée sur toute les différentes bases déployées.

    Ci quelqu'un a une idée pour résoudre ou contourner mon problème de requête je suis preneur

    Merci d'avance
    Didier

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 350
    Points : 1 701
    Points
    1 701
    Par défaut
    Bonjour,

    Et avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (((tblVisite.DateVisite)>=#10/10/2007# Or (tblVisite.DateVisite) Is Null))
    Cordialement.

  9. #9
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour à tous

    et merci à francishop pour sa solution.
    C'est tellement simple que j'ai honte d'avoir posé la question.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT tblClient.IdClient, Count(tblVisite.IdVisite) AS CompteDeIdVisite
    FROM tblClient LEFT JOIN tblVisite ON tblClient.IdClient = tblVisite.IdClient
    WHERE (((tblVisite.Date)>=#10/10/2007#)) OR (((tblVisite.Date) Is Null))
    GROUP BY tblClient.IdClient;

    Merci à tous ceux qui ont bien voulu essayer de me dépanner
    Didier

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/05/2012, 11h55
  2. [AC-2003] Requête avec comptage et à plusieurs regroupements!
    Par js8bleu dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 07/01/2010, 01h23
  3. [MySQL] Requête MYSQL avec filtrage et comptage
    Par pasbonte dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/11/2009, 15h05
  4. [AC-2003] Requête avec comptage
    Par ovett dans le forum Access
    Réponses: 0
    Dernier message: 08/06/2009, 17h05
  5. Requête avec comptage
    Par Arsene12 dans le forum WinDev
    Réponses: 4
    Dernier message: 16/04/2008, 14h26

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