ACCESS > select count group by + jointure

Résolu
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

26 réponses

Résumé de la discussion

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.

Bobot (l’IA à votre service)
  1. 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
    1. 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
      1. 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
        1. Bah, tu as enlever la requête 1 là?

          Je la vois pas dans ta requête qui englobe le tout.
          1
          1. 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
            1. S'il affiche des 6 partout c'est que la requête n'est plus bonne.

              Peux tu me la montrer?
              1
              1. $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
                1. 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
              2. Super ça ;)

                Bien joué. Bonne journée !
                1
                1. 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
                  1. 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
                    1. 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
                      1. 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
                        1. Et si tu rajoutes un DISTINCT au début?
                          0
                          1. C'est pareil mais pas dans le même ordre alaphabétique ...
                            0
                            1. Avec un GROUP BY dev_perso.region HAVING COUNT dev_perso.id_perso où un truc dans le genre sa pourrait marcher ??
                              0
                              1. 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
                            2. re, je viens de te laisser un message en private ;)
                              0
                              1. Héhéhé parfait ... mais la requête 2 c'est quoi ?
                                0
                                1. J'ai éditer mon post plus haut, j'avais foiré ;)
                                  0
                                  1. 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
                                    1. Bonjour,

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