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ête COUNT - afficher les lignes dont le compte est null [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 121
    Points : 77
    Points
    77
    Par défaut Requête COUNT - afficher les lignes dont le compte est null
    Bonjour,

    Je réalise une requête sur ma table principale "IP" pour avoir le nombre d'enregistrement par type d'enregistrement.
    Cela fonctionne sauf que ne s'affiche que les types d'intervention pour lesquels il y a au moins un type d'enregistrement et pas les autres.
    Je souhaiterais avoir aussi les types sans enregistrement dans ma réponse.
    Ma requête initiale est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT IP.Probleme_rencontre, Count(*) AS Nombre_intervention
    FROM IP
    GROUP BY IP.Probleme_rencontre
    Que j'ai modifié en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT IP.Probleme_rencontre, Count(*) AS Nombre_intervention
    FROM IP LEFT OUTER JOIN TypePb ON IP.Probleme_rencontre = TypePb.Probleme_rencontre
    GROUP BY IP.Probleme_rencontre
    Mais les résultats sont les mêmes...

    En somme, comment faire dans une requête count pour afficher aussi les résultats à zéro ?

    D'avance merci

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 374
    Points : 23 852
    Points
    23 852
    Par défaut
    J'essairai

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TypePb.Probleme_rencontre, DCount("Probleme_rencontre", "IP", "[Probleme_rencontre]=" & TypePb.Probleme_rencontre) AS Nombre_intervention
    FROM TypePb

    A+

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 121
    Points : 77
    Points
    77
    Par défaut
    Merci pour votre réponse.
    J'ai bien la liste de mes types d'interventions (puisque le SELECT porte désormais sur la table TypePb) mais j'ai #Erreur dans la colonne réponse Nombre_intervention...

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 910
    Points : 58 642
    Points
    58 642
    Billets dans le blog
    46
    Par défaut
    bonjour,

    essaie avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT IP.Probleme_rencontre, Count(TypePb.Probleme_rencontre) AS Nombre_intervention
    FROM IP LEFT OUTER JOIN TypePb ON IP.Probleme_rencontre = TypePb.Probleme_rencontre
    GROUP BY IP.Probleme_rencontre

  5. #5
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    Salut f-leb, marot_r et Tchebichef

    p't-être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT IP.Probleme_rencontre, Count(*) AS Nombre_intervention
    FROM IP LEFT JOIN TypePb ON IP.Probleme_rencontre = TypePb.Probleme_rencontre
    GROUP BY IP.Probleme_rencontre
    UNION
    SELECT TypePb.Probleme_rencontre, Count(*) AS Nombre_intervention
    FROM IP RIGHT JOIN TypePb ON  IP.Probleme_rencontre = TypePb.Probleme_rencontre
    GROUP BY TypePb.Probleme_rencontre

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 121
    Points : 77
    Points
    77
    Par défaut
    Bien le bonjour, amis du forum
    Tout d'abord un grand merci pour vos propositions.
    Malheureusement, la proposition de f-leb ramène un résultat doublement étrange puisque je n'ai que les types de problème pour lesquels il y a une intervention et en plus, j'ai des comptes à zéro pour deux d'entre eux.
    La proposition de vodiem renvoie tous les types de problème existant mais avec des comptes à 1 pour tous...
    Donc ça ne fonctionne toujours pas...
    D'autres idées ?

  7. #7
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour à tous,

    Problème d'analyse... il me semble.

    Il est normal que :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT IP.Probleme_rencontre, Count(*) AS Nombre_intervention
    FROM IP
    GROUP BY IP.Probleme_rencontre
    ne sorte que des Nombre_intervention<>0 (et ceci, même si Probleme_rencontre=null).

    Idem avec :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT IP.Probleme_rencontre, Count(*) AS Nombre_intervention
    FROM IP LEFT OUTER JOIN TypePb ON IP.Probleme_rencontre = TypePb.Probleme_rencontre
    GROUP BY IP.Probleme_rencontre
    car tu te contentes de lier TypePb. Mais cela nous met sur la voie de ce que tu souhaites obtenir (si, j'ai bien compris).


    Tchebichef, via l'assistant, il faut :
    • mettre en premier la table TypePb (FROM) ;
    • mettre en second la table IP (FROM) ;
    • lier les deux tables via Probleme_rencontre avec flèche à droite (LEFT JOIN) ;
    • passer en requête regroupement (GROUP BY) ;
    • sélectionner IP.Probleme_rencontre, Count(*) (SELECT).

    ==> tu devrais obtenir la liste complète des TypePb avec, en regard, le nombre d'enregistrement correspondant dans IP (0, si aucun enregistrement dans IP).

    C'est, sous une autre forme, la solution indiquée par René .

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 910
    Points : 58 642
    Points
    58 642
    Billets dans le blog
    46
    Par défaut
    salut,

    jointure dans le mauvais sens !!
    ce qui donnerait (à faire avec les assistants comme le décrit Richard)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TypePb.Probleme_rencontre, Count(IP.Probleme_rencontre) AS Nombre_intervention
    FROM TypePb LEFT JOIN IP 
    ON TypePb.Probleme_rencontre = IP.Probleme_rencontre
    GROUP BY TypePb.Probleme_rencontre

  9. #9
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    Citation Envoyé par f-leb
    jointure dans le mauvais sens !!
    y a-t-il vraiment un "bon" sens ?
    un FULL OUTER JOIN m'a paru plus approprié...

    La proposition de vodiem renvoie tous les types de problème existant mais avec des comptes à 1 pour tous...
    heu... et c'est pas normal je suppose... ^^
    pourrais tu donner un exemple de donnée et avec le sql utilisé parce que ce sql a été testé avec un résultat probant.


  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 121
    Points : 77
    Points
    77
    Par défaut Merci !
    Bonjour à tous,
    Un grand merci pour votre aide.
    Je dois vous avouer que je ne suis pas du tout familier avec l'assistant. J'ai donc tenter vos solutions directement en SQL.
    Et le code qui fonction est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT TypePb.Probleme_rencontre, Count(IP.Probleme_rencontre) AS Nombre_intervention
    FROM TypePb LEFT JOIN IP 
    ON TypePb.Probleme_rencontre = IP.Probleme_rencontre
    WHERE TypePb.Famille = 'S'
    GROUP BY TypePb.Probleme_rencontre
    J'ai rajouté un WHERE pour répondre à un besoin spécifique.
    En fait, c'est la relation entre les deux tables que j'avais mal faite --> refaite selon Richard_35.
    Donc problème résolu et encore merci à tous

  11. #11
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Tchebichef,

    Nous ne parlerons jamais assez de l'importance capitale de la première table du FROM dans une requête !

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 121
    Points : 77
    Points
    77
    Par défaut Réouverture
    Rebonjour,
    Je me permets de réouvrir la discussion car en progressant dans ma requête je tombe à nouveau sur un soucis que je n'arrive pas à résoudre.
    J'ai ajouté dans mon WHERE une condition de date, permettant de requêter sur une période et pas sur tous les enregistrements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT TypePb.Probleme_rencontre, Count(IP.Probleme_rencontre) AS Nombre_intervention
    FROM TypePb LEFT JOIN IP ON TypePb.Probleme_rencontre = IP.Probleme_rencontre
    WHERE (((TypePb.Famille)='S') AND ((IP.Date_inter)>=[Date_debut_incluse] And (IP.Date_inter)<[Date_fin_exclue]))
    GROUP BY TypePb.Probleme_rencontre;
    Problème : je me retrouve à nouveau avec uniquement les types de problème pour lesquels il y a au moins un enregistrement dans la table IP...
    Comment faire pour avoir tous les types de problèmes qui existent même ceux pour lesquels il n'y a pas d'enregistrement sur la période ?
    Seule la table IP contient un champ de date "Date_inter".
    D'avance merci pour votre aide

  13. #13
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    D'après toi, en cas d'absence dans IP, quelle est la valeur de IP.Date_inter ?

  14. #14
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 121
    Points : 77
    Points
    77
    Par défaut
    Si le type de problème n'est pas dans la table IP, alors forcément, la valeur IP.Date_inter n'existe pas.
    Au risque d'être ridicule, faut-il ajouter une condition pour inclure les IP.Date_inter null ?

  15. #15
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Tu as trouvé, toi-même, la solution :
    • si IP.Date_inter n'existe pas, alors IP.Date_inter=null ;
    • null n'est pas compris entre Date_debut_incluse et Date_fin_exclue ;
    • si tu souhaites afficher les IP.Date_inter=null, alors il faut le spécifier dans la requête.

  16. #16
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour à tous,

    Merci Vodiem , tu m'as appris quelque chose : je ne connaissais pas "FULL OUTER JOIN", c'est bon à savoir car, effectivement, cette liaison s'affranchit du sens des tables en présence (sauf pour Access).

    Tchebichef, pas la peine d'essayer, Access n'accepte pas cette liaison.

  17. #17
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 910
    Points : 58 642
    Points
    58 642
    Billets dans le blog
    46
    Par défaut
    resalut à tous,

    Citation Envoyé par Tchebichef Voir le message
    J'ai ajouté dans mon WHERE une condition de date, permettant de requêter sur une période et pas sur tous les enregistrements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT TypePb.Probleme_rencontre, Count(IP.Probleme_rencontre) AS Nombre_intervention
    FROM TypePb LEFT JOIN IP ON TypePb.Probleme_rencontre = IP.Probleme_rencontre
    WHERE (((TypePb.Famille)='S') AND ((IP.Date_inter)>=[Date_debut_incluse] And (IP.Date_inter)<[Date_fin_exclue]))
    GROUP BY TypePb.Probleme_rencontre;
    Problème : je me retrouve à nouveau avec uniquement les types de problème pour lesquels il y a au moins un enregistrement dans la table IP...
    et c'est normal

    Dans un LEFT JOIN, quant tu fais un WHERE sur la table de droite, c'est comme si tu faisais un INNER JOIN.
    C'est ce que je tente d'expliquer dans ce billet (admire le nouveau format WordPress stp).

    Deux solutions possibles:

    1°) On déplace le WHERE sur la table de droite dans la condition de jointure ON:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ON ((TypePb.Probleme_rencontre = IP.Probleme_rencontre)
        AND ((IP.Date_inter)>=[Date_debut_incluse] And (IP.Date_inter)<[Date_fin_exclue]))
    mais le SQL risque d'exploser si on passe en mode Design car Access ne sait pas interpréter la jointure dans le QBE.

    2°) On remplace la table de droite (IP) par une sous-requête:

    SousReq:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM IP WHERE
    ((IP.Date_inter)>=[Date_debut_incluse] And (IP.Date_inter)<[Date_fin_exclue]))

    la requête principale avec TypePb------>SousReq (jointure type 2 dans l'assistant)

  18. #18
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 121
    Points : 77
    Points
    77
    Par défaut MERCI !!
    Bonjour à tous,
    Merci Richard_35 et f-leb et tous les autres !
    J'ai appliqué la solution 1 de f-leb et ça marche parfaitement (je n'ai pas pris la 2 car je ne suis pas sur de connaitre la syntaxe pour une sous-requête).
    En tout cas, merci beaucoup !
    Je passe le point en résolu.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/05/2010, 11h10
  2. Comment afficher les lignes lorsque la valeur est vide ?
    Par matimat2k4 dans le forum Langage SQL
    Réponses: 24
    Dernier message: 02/04/2008, 17h29
  3. Réponses: 2
    Dernier message: 27/02/2008, 19h45
  4. Réponses: 5
    Dernier message: 24/07/2006, 15h01
  5. [VB.Net] Afficher des données dont la valeur est nulle
    Par badnane2 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/06/2006, 14h23

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