Rechercher : dans
Par :

ACCESS > select count group by + jointure

Dernière réponse le 11 aoû 2008 à 17:04:19 xdiz, le 8 aoû 2008 à 01:03:45 
 Signaler ce message aux modérateurs

Bonjour,
A 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

1

CaPiT, le 8 aoû 2008 à 09:10:41

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]

Répondre à CaPiT

2

xdiz, le 8 aoû 2008 à 13:48:19

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 :/

Répondre à xdiz

3

CaPiT, le 8 aoû 2008 à 14:11:13

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

Répondre à CaPiT

4

xdiz, le 8 aoû 2008 à 14:19:43

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 :/

Répondre à xdiz

5

CaPiT, le 8 aoû 2008 à 14:26:45

Et si tu rajoutes un DISTINCT au début?

Répondre à CaPiT

6

xdiz, le 8 aoû 2008 à 14:39:38

C'est pareil mais pas dans le même ordre alaphabétique ...

Répondre à xdiz

7

xdiz, le 8 aoû 2008 à 14:47:58

Avec un GROUP BY dev_perso.region HAVING COUNT dev_perso.id_perso où un truc dans le genre sa pourrait marcher ??

Répondre à xdiz

8

CaPiT, le 8 aoû 2008 à 15:00:09

Héhé, ouais c'est surement possible.

Au pire tu m'envoie ta base et je te fais ça ;)

Tu la mets sur http://cijoint.fr et tu me donne le lien.

Répondre à CaPiT

9

xdiz, le 8 aoû 2008 à 15:30:31

Re, je viens de te laisser un message en private ;)

Répondre à xdiz

10

CaPiT, le 8 aoû 2008 à 17:18:38
  • +2

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;

Répondre à CaPiT

11

xdiz, le 8 aoû 2008 à 17:22:06

Héhéhé parfait ... mais la requête 2 c'est quoi ?

Répondre à xdiz

12

CaPiT, le 8 aoû 2008 à 17:26:37

J'ai éditer mon post plus haut, j'avais foiré ;)

Répondre à CaPiT

13

xdiz, le 8 aoû 2008 à 17:32:45

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 :/

Répondre à xdiz

14

CaPiT, le 11 aoû 2008 à 08:27:00

Bonjour,

as tu réussi à résoudre ton problème (je n'étais pas là du week end).

Répondre à CaPiT

15

xdiz, le 11 aoû 2008 à 08:41:13

Bonjour,

Normal que tu ne sois pas là c'était le we ^^

Euh non, je vais essayer autre chose... je te tiens au courant ;)

Répondre à xdiz

16

CaPiT, le 11 aoû 2008 à 08:42:24

Ok d'accord.

N'hésite pas à me faire part de l'avancer de ton problème ;)

Répondre à CaPiT

17

xdiz, le 11 aoû 2008 à 09:03:58

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

Répondre à xdiz

18

CaPiT, le 11 aoû 2008 à 09:09:42

La requête 1 marche quand même? Essaie la seule.

Répondre à CaPiT

19

xdiz, le 11 aoû 2008 à 09:13:30

Oui elle marche ... sous access les 2 requetes marchent mais pas en les executant a partir d'un script php :/

Répondre à xdiz

20

CaPiT, le 11 aoû 2008 à 09:21:32

Ouai je comprends ça.

Si la requête 1 ne fonctionne pas du tout, c'est que ton code qui execute les requêtes ne fonctionne pas.

Mais si la requête 1 marche et pas la requête 2 en php, c'est qu'il y a un soucis d'interprétation de la requête 2 et là ça pose problème ^^

Répondre à CaPiT

21

xdiz, le 11 aoû 2008 à 09:32:11

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;

Répondre à xdiz
Collection CommentÇaMarche.net