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;
-
Super ça ;)
Bien joué. Bonne journée ! -
$query_devis_academie = "SELECT dev_perso.region, Count(dev_devis.id_devis) AS nbr_devis_academie FROM dev_devis INNER JOIN dev_perso ON dev_devis.id_perso = dev_perso.id_perso WHERE (dev_devis.date_creation) BETWEEN #$dateDeb# And #$dateFin# AND dev_perso.region <> 'monde' GROUP BY dev_perso.region; "; $result_devis_academie = odbc_exec($cnx, $query_devis_academie); $query_perso_academie = "SELECT DISTINCTROW Count(dev_devis.id_perso) AS nbr_perso_academie, dev_perso.region FROM dev_devis, dev_perso WHERE dev_devis.id_perso = dev_perso.id_perso AND (dev_devis.date_creation) BETWEEN #$dateDeb# And #$dateFin# AND dev_perso.region <> 'monde' GROUP BY dev_perso.region"; $result_perso_academie = odbc_exec($cnx, $query_perso_academie); while (odbc_fetch_row($result_perso_academie)) { while (odbc_fetch_row($result_devis_academie)) { $region = odbc_result($result_devis_academie, 'region'); $nbr_devis = odbc_result($result_devis_academie, 'nbr_devis_academie'); $nbr_perso = odbc_result($result_perso_academie, 'nbr_perso_academie'); ?> <tr> <td><?php echo $region; ?></td> <td><?php echo $nbr_perso; ?></td> <td><?php echo $nbr_devis; ?></td> </tr> <?php }
Voila tu as tout ;)-
C'est bon TROUVER :
J'ai fait une sous requête dans le where ;)
$req1 = "SELECT DISTINCT dev_devis.id_perso FROM dev_devis WHERE (dev_devis.date_creation) BETWEEN #$dateDeb# And #$dateFin#"; $query_perso_academie = " SELECT Count(dev_perso.id_perso) AS nbr_perso_academie, dev_perso.region FROM dev_perso WHERE dev_perso.id_perso IN ($req1) AND dev_perso.region <> 'monde' GROUP BY dev_perso.region ";
TAG: distinct count group by sous requête select where in
-
-
S'il affiche des 6 partout c'est que la requête n'est plus bonne.
Peux tu me la montrer? -
J'ai testé avec 2 requête, cela ne marchait pas bien (erreur dans la clause FROM) :/
DISTINCTROW ne fonctionne que si la requête porte sur au moins deux tables et qu'une seule est concernée dans la projection.
J'ai mis la jointure dans le WHERE et ajouté les conditions ...
Il me met des 6 partout (6 qui correspont au nombre de devis regroupé par region pour celle de montpellier) alors que je devrais avoir çanbr_perso_academie region 2 Montpellier 1 Nancy-Metz 1 Paris
-
Bah, tu as enlever la requête 1 là?
Je la vois pas dans ta requête qui englobe le tout. -
On a eu la même idée :d
Tres bon tuto : https://access.developpez.com/sql/#L1.2.1
SELECT DISTINCTROW dev_perso.region, Count(dev_devis.id_perso) AS nbr_perso_academie FROM dev_devis, dev_perso WHERE dev_devis.id_perso = dev_perso.id_perso AND (dev_devis.date_creation) BETWEEN #$dateDeb# And #$dateFin# AND dev_perso.region <> 'monde' GROUP BY dev_perso.region
J'ai tout rassemblé dans une seule requête, aucune erreur d'execution, toutes les regions ont le mêmes nombre de personne ce qui est FAUX, problème dans ma boucle : peut etre ! Problème dans la requête : probable ... -
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
-
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; -
Oui elle marche ... sous access les 2 requetes marchent mais pas en les executant a partir d'un script php :/
-
La requête 1 marche quand même? Essaie la seule.
-
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 -
Ok d'accord.
N'hésite pas à me faire part de l'avancer de ton problème ;) -
Bonjour,
Normal que tu ne sois pas là c'était le we ^^
Euh non, je vais essayer autre chose... je te tiens au courant ;) -
Bonjour,
as tu réussi à résoudre ton problème (je n'étais pas là du week end). -
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 :/ -
J'ai éditer mon post plus haut, j'avais foiré ;)
-
Héhéhé parfait ... mais la requête 2 c'est quoi ?
-
re, je viens de te laisser un message en private ;)
-
Avec un GROUP BY dev_perso.region HAVING COUNT dev_perso.id_perso où un truc dans le genre sa pourrait marcher ??
- 1
- 2