ACCESS > select count group by + jointure
RésoluA l'aide de ce post http://www.commentcamarche.net/forum/affich 5138406 sql select count distinct group by access
dont je me suis aidé, j'ai reussi à faire ma requête cependant il faudrait une jointure en plus ....
SELECT Count(dev_perso.id_perso) AS id_perso_monde, dev_perso.region FROM (select distinct * from dev_perso) WHERE dev_perso.region <> 'monde' GROUP BY dev_perso.region
id_perso_monde region 2 Montpellier 1 Nancy-Metz 1 Paris
id_perso est la clef primaire de la table dev_perso et la clef étrangère (sans integrité referencielle) de la table dev_devis
Je cherche à compter le nombre de personne en fonction des regions sur une periode donnée (date_creation). Cet attribut est dans une autre table : dev_devis. J'ai essayé de faire ceci (jointure + condition), mais sa me donne des resultats foireux !
SELECT Count(dev_perso.id_perso) AS id_perso_monde, dev_perso.region FROM (select distinct * from dev_perso), dev_devis WHERE dev_perso.region <> 'monde' AND (dev_devis.date_creation) BETWEEN #01/01/2008# And #31/12/2008# GROUP BY dev_perso.region
Je fais trop compliquer ? Y'a-t-il plus simple, je galère depuis 1j, je n'y vois plus clair :/
Merci d'avoir lu ;)
Configuration: Windows XP Firefox 3.0.1
26 réponses
Problème : compter le nombre de personnes par région sur une période donnée en s'appuyant sur une jointure entre les tables dev_perso et dev_devis et sur le filtre de date_creation. Des solutions proposées incluent d'abord une sous-requête retournant les id_perso distincts de dev_devis, puis un INNER JOIN avec dev_perso pour compter les personnes par région. Pour certains, une requête unique utilisant la syntaxe FROM dev_devis, dev_perso avec une condition de jointure et le filtre date_creation peut aussi fonctionner. Cependant, la boucle côté code peut fausser les chiffres si les résultats sont ensuite traités en parallèle, ce qui peut nécessiter une vérification des liens entre les appels et les regroupements.
-
Trouvééé !! ^^
1ere requête:SELECT DISTINCT dev_devis.id_perso FROM dev_devis;
2eme requête:SELECT dev_perso.region, Count(req1.id_perso) AS Compte_id_perso FROM dev_perso INNER JOIN req1 ON dev_perso.id_perso = req1.id_perso GROUP BY dev_perso.region;
-
Bonjour,
il n'y a aucune jointure dans tes requêtes??
Une jointure c'est:
- Soit après le FROM
INNER JOIN [Table1] ON[Table2].[Champs2]= [Table1].[Champs1]
- Soit dans le WHERE:
[Table2].[Champs2]= [Table1].[Champs1] -
Salut,
J'ai essayé ceci:
SELECT Count(dev_perso.id_perso) AS id_perso_monde, dev_perso.region FROM dev_devis INNER JOIN dev_perso ON dev_devis.id_perso = dev_perso.id_perso, (SELECT DISTINCT * FROM dev_perso) WHERE dev_perso.region <> 'monde' AND (dev_devis.date_creation) BETWEEN #01/01/2008# And #31/12/2008# GROUP BY dev_perso.region
id_perso_monde region 42 Montpellier 7 Nancy-Metz 28 Paris
Le resultat est vraiment a coté de la plaque :/ -
Je comprends pas ton SELECT DISTINCT(...), que fait t'il là ? Fais:
SELECT Count(dev_perso.id_perso) AS id_perso_monde, dev_devis .region, dev_perso.* FROM dev_devis INNER JOIN dev_perso ON dev_devis.id_perso = dev_perso.id_perso WHERE dev_perso.region <> 'monde' AND (dev_devis.date_creation) BETWEEN #01/01/2008# And #31/12/2008# GROUP BY dev_perso.region
-
Il permet d'enlever les doublons liés au id_perso...
Chaque personne enregistrée peut créer autant de devis quelle veut, chaque devis correspond à une personne. Cependant une personne non enregistrée peut créer un devis son id_perso sera donc null
Je souhaite savoir le nombre de personne ayant créer un/des devis regroupée par region... sachant que dans une même region, plusieurs personne existent ... normal :)
Je dois trouver ce resultat
id_perso_monde region 2 Montpellier 1 Nancy-Metz 1 Paris
Mais avec une jointure et une selection supplémentaire :)
Je viens de tester ta requete et voici le resultat
id_perso_monde region 6 Montpellier 1 Nancy-Metz 4 Paris
Il me retourne le nombre de devis crée regourpé par région et non pas le nombre de personne regoupé par région :/ -
Et si tu rajoutes un DISTINCT au début?
-
C'est pareil mais pas dans le même ordre alaphabétique ...
-
Avec un GROUP BY dev_perso.region HAVING COUNT dev_perso.id_perso où un truc dans le genre sa pourrait marcher ??
-
re, je viens de te laisser un message en private ;)
-
Héhéhé parfait ... mais la requête 2 c'est quoi ?
-
J'ai éditer mon post plus haut, j'avais foiré ;)
-
EDIT: Merci pour cette requête mais elle ne fait pas ce que je souhaite : la condition date_creation n'y est pas
WHERE dev_devis.date_creation BETWEEN #01/01/2008# And #31/12/2008#
Lorsque je l'insère, ça me donne des resultats foireux comme précédement :/ -
Bonjour,
as tu réussi à résoudre ton problème (je n'étais pas là du week end). -
Bonjour,
Normal que tu ne sois pas là c'était le we ^^
Euh non, je vais essayer autre chose... je te tiens au courant ;) -
Ok d'accord.
N'hésite pas à me faire part de l'avancer de ton problème ;) -
Je travail sous PHP/ACCESS, voici un exemple :
$req1 = "SELECT DISTINCT dev_devis.id_perso FROM dev_devis;";
$query_perso_academie = " SELECT dev_perso.region, Count($req1.id_perso) AS Compte_id_perso
FROM dev_perso INNER JOIN $req1 ON dev_perso.id_perso = $req1.id_perso
GROUP BY dev_perso.region; ";
$result_perso_academie = odbc_exec($cnx, $query_perso_academie);
echo $query_perso_academie."<br />"; // permet de verifier si y'a une erreur de synthaxe ;)
Sous access tes 2 requetes marchent, mais pas en executant ce mini script :/ relou relou relou -
La requête 1 marche quand même? Essaie la seule.
-
Oui elle marche ... sous access les 2 requetes marchent mais pas en les executant a partir d'un script php :/
-
Exact car la requête 2 n'arrive pas a executer la req1 dans la 2eme ;)
Voici l'erreur:
Erreur de syntaxe dans la clause FROM
Et la requête 2 générée:
SELECT dev_perso.region, Count(SELECT DISTINCT dev_devis.id_perso FROM dev_devis.id_perso) AS nbr_perso_academie FROM dev_perso INNER JOIN SELECT DISTINCT dev_devis.id_perso FROM dev_devis ON dev_perso.id_perso = SELECT DISTINCT dev_devis.id_perso FROM dev_devis.id_perso GROUP BY dev_perso.region; -
Sinon c'est peut-être la jointure qui ne fonctionne pas (ce qui m'étonnerais).
Mais bon, le message d'erreur à l'air de signifier que c'est le FROM qui foire.
Remplace tout de même:FROM dev_perso INNER JOIN $req1 ON dev_perso.id_perso = $req1.id_perso
par:FROM dev_perso, $req1 WHERE dev_perso.id_perso = $req1.id_perso
- 1
- 2