ACCESS > select count group by + jointure

Résolu/Fermé
xdiz Messages postés 108 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 19 décembre 2012 - 8 août 2008 à 01:03
CaPiT Messages postés 609 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 21 avril 2010 - 11 août 2008 à 17:04
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 ;)

26 réponses

CaPiT Messages postés 609 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 21 avril 2010 51
8 août 2008 à 17:18
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;
2
CaPiT Messages postés 609 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 21 avril 2010 51
11 août 2008 à 09:32
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
xdiz Messages postés 108 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 19 décembre 2012 41
11 août 2008 à 10:31
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 ...
1
CaPiT Messages postés 609 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 21 avril 2010 51
11 août 2008 à 10:44
Bah, tu as enlever la requête 1 là?

Je la vois pas dans ta requête qui englobe le tout.
1

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

Posez votre question
xdiz Messages postés 108 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 19 décembre 2012 41
11 août 2008 à 11:07
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 ça
nbr_perso_academie    region
2	             Montpellier
1	             Nancy-Metz
1	             Paris
1
CaPiT Messages postés 609 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 21 avril 2010 51
11 août 2008 à 11:10
S'il affiche des 6 partout c'est que la requête n'est plus bonne.

Peux tu me la montrer?
1
xdiz Messages postés 108 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 19 décembre 2012 41
11 août 2008 à 11:39
$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 ;)
1
xdiz Messages postés 108 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 19 décembre 2012 41
11 août 2008 à 16:00
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
0
CaPiT Messages postés 609 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 21 avril 2010 51
11 août 2008 à 17:04
Super ça ;)

Bien joué. Bonne journée !
1
CaPiT Messages postés 609 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 21 avril 2010 51
8 août 2008 à 09:10
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]
0
xdiz Messages postés 108 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 19 décembre 2012 41
8 août 2008 à 13:48
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 :/
0
CaPiT Messages postés 609 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 21 avril 2010 51
8 août 2008 à 14:11
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
0
xdiz Messages postés 108 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 19 décembre 2012 41
8 août 2008 à 14:19
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 :/
0
CaPiT Messages postés 609 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 21 avril 2010 51
8 août 2008 à 14:26
Et si tu rajoutes un DISTINCT au début?
0
xdiz Messages postés 108 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 19 décembre 2012 41
8 août 2008 à 14:39
C'est pareil mais pas dans le même ordre alaphabétique ...
0
xdiz Messages postés 108 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 19 décembre 2012 41
8 août 2008 à 14:47
Avec un GROUP BY dev_perso.region HAVING COUNT dev_perso.id_perso où un truc dans le genre sa pourrait marcher ??
0
CaPiT Messages postés 609 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 21 avril 2010 51
8 août 2008 à 15:00
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.
0
xdiz Messages postés 108 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 19 décembre 2012 41
8 août 2008 à 15:30
re, je viens de te laisser un message en private ;)
0
xdiz Messages postés 108 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 19 décembre 2012 41
8 août 2008 à 17:22
Héhéhé parfait ... mais la requête 2 c'est quoi ?
0
CaPiT Messages postés 609 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 21 avril 2010 51
8 août 2008 à 17:26
J'ai éditer mon post plus haut, j'avais foiré ;)
0
xdiz Messages postés 108 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 19 décembre 2012 41
8 août 2008 à 17:32
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 :/
0
CaPiT Messages postés 609 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 21 avril 2010 51
11 août 2008 à 08:27
Bonjour,

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