Comptage avec 0 pour valeurs non trouvées

Fermé
lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016 - 25 juin 2015 à 21:26
lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016 - 28 juil. 2015 à 14:20
Bonjour,

J'ai une appli Acces VBA avec 2 tables:
Une table "Participants" où chaque individu est associé à un pays
Une table "Textes" où les textes sont associés à un participant

Je voudrais obtenir, depuis la table "Textes", un comptage des textes par pays du participant, mais en incluant, avec 0, les pays pour lesquels aucun texte ne figure en table 2

Pour l'instant, j'utilise le code suivant, mais qui bien sûr ne me compte pas les pays "sans textes" : SELECT [R_textes-pays].[Nbr-textes] FROM [R_textes-pays];

Ma requete R_textes-pays :
SELECT Count(*) AS [Nbr-textes], Pays
FROM Textesavecpays AS requête
GROUP BY Pays;

Ma requete textesavecpays :
SELECT Participants.identité AS Participants_identité, Participants.Pays, Participants.[Année 2015], Textes.identité AS Textes_identité, Textes.Titre, Textes.Catégorie, Textes.[Date reçu]
FROM Participants INNER JOIN Textes ON Participants.N° = Textes.identité
WHERE (((Participants.[Année 2015])=-1));

Merci d'avance de vos lumières
Cordialement
Roland

13 réponses

Bonjour

Si vous avez les tables comme celles-ci
tables participants
id_participant
nom_participant
pays

table textes
id_texte
nom_texte
id_participant

Je vous propose cette solution.


SELECT participants.pays, COUNT( textes.nom_texte )
FROM participants, textes
WHERE participants.id_participant = textes.id_participant
GROUP BY participants.pays
1
Bonjour,
Merci de ta réponse super rapide.

J'ai donc inséré cette requête:
----
SELECT participants.pays, COUNT(textes.texte)
FROM participants, textes
WHERE Participants.identité=Textes.identité
GROUP BY participants.pays;
----
Mais j'ai ce message d'erreur: "incohérence de type dans une expression"
Je pense que cela vient d ece que le champ "identité" est en format "texte" dans la table "participants", alors qu'il est en format numérique dans la table "Textes", où il se gère par une zone de liste déroulante depuis la table"Participants"
Tu as un avis ?
Merci d'av.
Roland
0
Bonjour,

Oui je pense que çà doit venir de là.
Essayer de corriger cela et dîtes moi si c'est bon.
0
lecrol > Delphine
27 juin 2015 à 07:40
Bonjour,
Merci, Delphine, de votre gentillesse. Mais comment "corriger cela"? Je ne peux pas changer la définition des deux champs "identité" puisque, dans la table "Textes," les enregistrements se créent en choisissant dans une zone de liste le participant depuis la table 1.
Il doit y avoir une autre syntaxe de la requête. Mais je ne la trouve pas.

Merci encore
Roland
0
lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016 24
27 juin 2015 à 07:51
Re-bonjour,
Excusez-moi. J'ai eu l'idée sitôt après vous avoir répondu: il me suffisait de comparer "Textes-identité" avec "Participants.n°", c'est à dire avec le numéro clé d'enregistrement.

SELECT participants.pays, COUNT(textes.texte)
FROM participants, textes
WHERE Participants.N°=Textes.identité
GROUP BY participants.pays;

La requête ainsi définie fonctionne bien. Mais je n'ai pas le résultat que je voudrais, à savoir "tous les pays" de la table participants avec 0 en comptage s'ils n'ont auun texte en table "Textes".
Pour l'instant je n'obtiens que le seul pays représenté dans ma table textes, mais pas les autres qui ne le sont pas encore.

Bien cordialement,
Roland
0
Bonjour Roland

Pour info, si vous voulez n'afficher que les pays pour lesquels le
count 
est égal à 0 il faut faire :

SELECT participants.pays, COUNT(textes.texte)
FROM participants, textes
WHERE Participants.N°=Textes.identité
HAVING COUNT(textes.texte) =0
GROUP BY participants.pays;
0
lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016 24
29 juin 2015 à 15:20
Bonjour Delphine,

Excusez-moi de ne pas vous avoir répondu plus tôt, mais j'étais "loin" de mon ordi et de cette appli qui m'est "perso" Mais je vous remercie encore de votre réponse bien sympa.

Pour répondre à votre "si vous voulez n'afficher que les pays pour lesquels le count est égal à 0...",
je vous précise que ma demande est d'afficher TOUS les pays de la table 1 ("Participants") avec, soit 0 s'ils n'ont pas de textes en table 2, soit le nombre de textes qui s'y trouvent. Exemple:
Canada 0
France 10
Brésil 6
Italie 0
Belgique 9

Encore merci
Roland
-----------------------------------------------
0
lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016 24
11 juil. 2015 à 07:49
Bonjour,
Delphine, où êtes-vous ? Sans doute, partie en vacances ? Je confirme ma demande, pour quelqu'un d 'autre qui serait là pour me lire : comment faire un comptage access Vba en incluant, dans les résultats, les valeurs égales à zéro ? Dans une table 1, des individus avec pour chacun un pays. Dans une table 2, des textes par participants, Je voudrais obtenir pour TOUS LES PAYS de la table1, le nombre de textes de la table 2, avec un zéro si aucun texte trouvé pour un pays X ou Y.

Merci d'avance.
Roland
0
castours > lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016
13 juil. 2015 à 09:27
bonjour
pour t'aider et mieux comprendre ton probleme, peux tu mettre ta base sur le site avec sur c_joint.com
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016 24
13 juil. 2015 à 10:19
Merci, Castours, de venir m'aider et de pencher sur mon problème

Voici l'adresse du lien cjoint https://www.cjoint.com/c/EGninqyoVQS

Ma demande conceren le formulaire synthèse sue le quel je voudrais voir figurer un comptage des textes par pays, mais pour TOUS LES PAYS de la table "participants", en incluant donc les pays pour lesquels aucun texte n'a encore été reçu.
Par exemple, je voudrais obtenir un tableau comme suit:
allemagne... 0
italie... 1
Grêce... 10
Maroc... 0
France .. 23

Merci encore de tes lumières
Roland
0
lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016 24
17 juil. 2015 à 19:25
Bien reçu ma base, Castours ?
Roland
0
lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016 24
27 juil. 2015 à 19:12
Bonjour

Apparememnt, ma demande fait sécher (ou fuir) les bonnes volontés qui m'y répondent. Après Delphine qui elle au moins est allée jusqu'à 2 ou 3 réponses, c'est Castours qui s'est dissous dans le silence sitôt après que je lui ai envoyé la base qu'il m'avait demandée !

Ma question serait-elle à ce point exceptionnelle ou .. diabolique ?
Roland -----
0
Bonjour,
L'habitude et la correction sur le forum est que lorsque une personne commence à répondre d'autre internaute ne vienne pas lui disputer la réponse, et le laisse mener à bien le dialogue.
Puisque tu restes en rade, je te propose ma solution.
Les 2 requêtes déjà proposées fonctionnent bien; il suffit alors de les faire tourner en même temps. Càd une requête Union
Attention: Elles doivent obligatoirement être saisies en mode SQL.
Pour ce faire, tu ouvres chacune des requêtes en mode SQL, et tu copies/colles l'une dernière l'autre.

SELECT participants.pays, COUNT(textes.texte) FROM participants, textes WHERE Participants.N°=Textes.identité GROUP BY participants.pays
UNION
SELECT participants.pays, COUNT(textes.texte) FROM participants, textes WHERE Participants.N°=Textes.identité HAVING COUNT(textes.texte) =0 GROUP BY participants.pays

Ainsi tu devrais avoir le résultat que tu souhaites.
Bonne suite
0
lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016 24
Modifié par lecrol le 27/07/2015 à 21:54
Merci de ta réponse;
Tu te doutes que j'ai aussitôt essayé. La clause having semble devoir se placer après le "Group by", sinon Access me dit "erreur de syntaxe dans a clause having". C'est donc ce que j'ai fait.
Mais le résultat n'est pas encore le bon. J'ai la liste des seuls pays "avec textes", et pas autres (les "sans texte") et, curieusement, je n'ai pas le nombre de textes trouvés, alors que je l'ai bien si j'exécute la requête séparément. Si tu veux, je te renvoie ma base.
Merci encore
Roland
0
lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016 24
28 juil. 2015 à 11:54
Bonjour
Mais c'est bien ce que j'ai fait, tu penses. Je te l'a
0
Je n'ai évidemment pas pu tester la base originelle.
Mais c'est vrai que j'ai oublié de préciser que pour faire fonctionner une requête Union, il est indispensable que les 2 requêtes réunies doivent être exactement identiques quant aux champs sélectionnés et dans le même ordre. Autrement dit, parfaitement superposables; seuls les résultats changent.
Ils faut donc s'assurer que les 2 fonctionnent correctement séparément avec les résultats attendus, et que ces résultats forment bien les mêmes champs, les mêmes colonnes et dans le même ordre.
Bonne suite
0
Re...
Essaye :

SELECT participants.pays, COUNT(textes.texte) FROM participants, textes WHERE Participants.N°=Textes.identité HAVING COUNT(textes.texte) > 0 GROUP BY participants.pays
UNION
SELECT participants.pays, COUNT(textes.texte) FROM participants, textes WHERE Participants.N°=Textes.identité HAVING COUNT(textes.texte) = 0 GROUP BY participants.pays
0
lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016 24 > Tessel75
28 juil. 2015 à 07:19
Bonjour et encore merci de ta patience, Tessel 75
J'ai encore le message "erreur de syntaxe sur la clause having (sans autre explication)
Je ne l'ai plus si je place cette clause après la clause "Group By".
Mais le résultat est le même. Seuls ressortent les pays "avec textes".
En essayant chacune des requêtes séparément, je vérifie bien que la requête "count = 0" me donne un tableau vide. C'est là qu'est ne noeud du problème selon moi.
Cordialement,
Roland

Voici mon écriture:
SELECT participants.pays, COUNT(textes.texte) FROM participants, textes WHERE Participants.N°=Textes.identité GROUP BY participants.pays HAVING COUNT(textes.texte) > 0
UNION
SELECT participants.pays, COUNT(textes.texte) FROM participants, textes WHERE Participants.N°=Textes.identité GROUP BY participants.pays HAVING COUNT(textes.texte) = 0
0
Je t'ai dit d'essayé les 2 requêtes isolément un à une. Ce n'est que quand tu es sûr que ça marche que tu fait "Union"
Mais le plus simple ou le plus facile est de concevoir les requêtes en mode graphique et de les passer en SQL seulement après. Comme ça tu apprends la syntaxe. Sinon tu vas ramer pendant des heures pour rien.
Bon courage.
0
lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016 24
28 juil. 2015 à 11:58
Bonjourn
Mais c'est bien ce que j'ai fait, tu t'en doutes. Comme je te l'ai dit dans mon message, j'ai essayé chacune des deux requêtes SEPAREMENT. Celle avec "count >0" fonctionne bien, Celle avec "count =0" me donne un résultat vide. Encore merci de m'aider comme tu le fais, gentiment et avec patience. On va y arriver !!
Roland
0
Re...
J'ai repris ta base initiale.
D'abord, elle n'est pas anonymisée. C'est très dangereux parce qu'il y a des noms que je suppose réels et des N° de téléphone. C'est très moyen.
De plus les tables sont très mal construites et les liens ne sont pas construits sur des champs qui ne sont pas des champs d'identifiants. Alors je ne peux rien faire à moins de tout reconstruire.
Il faut que tu reprennes tout ça.
0
lecrol Messages postés 200 Date d'inscription samedi 4 juillet 2009 Statut Membre Dernière intervention 25 juillet 2016 24
28 juil. 2015 à 14:20
Bonjour,
Bon, tant pis pour moi. C'est pas de chance.

Mais il reste que la requête :
SELECT participants.pays, COUNT(textes.texte) FROM participants, textes WHERE Participants.N°=Textes.identité HAVING COUNT(textes.texte) > 0 GROUP BY participants.pays
écrite telle que, donne une "erreur de syntaxe".

Par contre écrite avec la clause "Group By avant la clause having
ELLE FONCTIONNE CORECTEMENT !

Quant à la requête
SELECT participants.pays, COUNT(textes.texte) FROM participants, textes WHERE Participants.N°=Textes.identité HAVING COUNT(textes.texte) = 0 GROUP BY participants.pays
elle ne donne qu'un résultat vide, même après aviir replacé la clause "having" après le Group by

Désolé
Roland

PS Bien sûr, détruis la base que je t'ai envoyée. Encore merci
.
0