IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Regrouper code postal par groupe de 6 presque identiques sur AC-2003 [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 4
    Points
    4
    Par défaut Regrouper code postal par groupe de 6 presque identiques sur AC-2003
    Bonjour,

    J'ai besoin de regrouper des données en les classant par commune, dès que 6 codes postaux ont les trois premiers chiffres en commun AAA*** mais je ne sais pas du tout comment faire en Sql ou VBA sur Access 2003.
    Quelqu'un aurait-il une idée ?
    Par avance merci !

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    si c'est pour une requête, tu peux utiliser left([codpos];3) pour regrouper et trier, mais un groupe de 6 est-ce vraiment une condition inévitable ?
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour et bienvenue chez nous,

    Peux-tu donner un exemple :

    AAA001 5
    AAA002 7
    AAA003 3
    AAA004 2
    AAA005 1
    AAA006 5
    AAA007 7

    BBB001 8
    BBB002 2
    BBB003 4


    Que voudrais-tu comme résultat ?
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Le regroupement par 6 est pas nécessaire mais en gros si j'ai

    21320
    21050
    21000
    21000
    86000
    75400
    21500
    21800
    21000
    21050
    21000

    je voudrais juste sortir les 210*** dès qu'il y en a plus de 6. Pour finalement mettre un petit signe sur des enveloppes si il y en a + de 6.
    C'est pour un routage et je dois sortir les séries de + de 6 pour un tarif différent lors des envois.

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    tu peux t'inspirer de ceci :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT adresse, ville, cp,  ' etc ... 
    FROM matable
    WHERE Left([cp],3) In (SELECT Left([cp],3) AS reg FROM matable GROUP BY Left([cp],3)
    HAVING Count(*)>6);
    Par contre si on considère qu'un code postal (21000 dans ton exemple) est unique il faudra remplacer la requête du In (select ...) par une requête de regroupement sur le code postal :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT adresse, ville, cp,  ' etc ...
    FROM matable
    WHERE (Left([cp],3) In (SELECT  Left([cp],3) AS reg FROM (SELECT cp FROM matable GROUP BY cp) as matb GROUP BY Left([cp],3)
    HAVING Count(*)>6));
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Merci ! Ça marche au poil !
    Un grand bravo. Je vais pouvoir imprimer mes enveloppes comme il faut !

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Désolé, j'ai encore une petite question..
    Comment faire si, au lieu de filtrer ma sélection, je veux simplement afficher ou non un caractère dans un champ..

    Par exemple j'aurai l'ensemble des résultats mais pour ceux qui ont plus de 6 caractères en commun, une petite étoile en plus dans un champ :


    ID CP ETOILE
    1 21000 *
    2 21050 *
    3 21500 *
    4 81000
    5 21000 *
    6 21030 *
    7 21020 *
    8 73000
    9 21550 *


    Désolé si la question vous semble bête.. Je suis vraiment un noob..

  8. #8
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    oui, tout simplement avec UNION et NOT IN on ajoute ceux qui ont été exclus de la première requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT id, cp, "*" as etoile
    FROM matable
    WHERE (Left([cp],3)) In (SELECT Left([cp],3) AS reg FROM (SELECT cp FROM matable GROUP BY cp) as matb GROUP BY Left([cp],3)
    HAVING Count(*)>6)
    UNION
    SELECT id, cp, null
    FROM matable
    WHERE (Left([cp],3)) Not In (SELECT Left([cp],3) AS reg FROM (SELECT cp FROM matable GROUP BY cp) as matb GROUP BY Left([cp],3)
    HAVING Count(*)>6);
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Super ! Encore bravo et merci !

  10. #10
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Bonsoir,
    Désolé de t'embêter encore une fois, mais je ne sais pas pourquoi la requête ne sélectionne pas toutes les occurrences qui ont plus de 6* les 3 premiers chiffres en commun ;

    Par exemple cette série qui devrait être marquée mais qui ne l'est pas :

    CP PRENOM etoile
    97450 Fernand
    97450 France-Marie
    97429 Bernadette
    97429 Marie-Annick
    97425 Ange
    97425 Arlette
    97425 Miguy
    97425 Patrick
    97419 Olivia
    alors que celle ci oui :

    CP PRENOM etoile
    75020 Alexandre *
    75020 Augustin Alfred *
    75020 Brigitte *
    75020 Ombeline *
    75017 Arnaud *
    75017 Grégoire *
    75017 Jean-Marc *
    75017 Louis *
    75017 Marc *
    75017 Marie-Astrid *

    Voilà ma requête basée sur la tienne :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT [routage].CP, [routage].PRENOM, "*" AS etoile
    FROM [routage]
    WHERE (Left([routage].CP,3))  In (SELECT Left([routage].CP,3) AS reg FROM (SELECT[routage].CP FROM [routage] GROUP BY [routage].CP) as matb GROUP BY Left([routage].CP,3)
    HAVING Count(*)>6)
    UNION SELECT [routage].CP, [routage].PRENOM, " " AS etoile
    FROM [routage]
    WHERE (Left([routage].CP,3)) Not  In (SELECT Left([routage].CP,3) AS reg FROM (SELECT[routage].CP FROM [routage] GROUP BY [routage].CP) as matb GROUP BY Left([routage].CP,3)
    HAVING Count(*)>6)
    ORDER BY CP DESC;


    Et quand je change le HAVING Count(*)>6) avec >3 ça me récupère bien les premiers

    CP PRENOM etoile
    98800 Gaëtan
    97450 Fernand *
    97450 France-Marie *
    97429 Bernadette *
    97429 Marie-Annick *
    97425 Ange *
    97425 Arlette *
    97425 Miguy *
    97425 Patrick *
    97419 Olivia *
    97290 Chantale et Lucile
    97200 Jean-Marie
    mais du coup aussi des séries de 5

    CP PRENOM etoile
    56380 Andrée *
    56380 Philippe *
    56350 Gilles *
    56340 Chantal *
    56330 Marie *
    56240 Hélène
    Et ça en manque toujours d'autres :

    CP PRENOM etoile
    21000 Arnaud
    21000 Bernard
    21000 Catherine-Marie
    21000 Jean-Baptiste
    21000 Mathias
    21000 Yves
    CP PRENOM etoile
    11290 Benoît
    11290 Eric
    11290 Foucauld
    11290 François
    11290 Jean Manuel
    11290 Jérôme
    11290 Michel
    11290 Philippe

    La du coup parce qu'elles sont peut-être trop similaires ? sur plus de 3 caractères ?

    Bref, je suis un peu largué :/

  11. #11
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    il faut que tu relises le post # 5 de cette discussion, je te proposais 2 solutions selon que tu voulais ou non un regroupement unique sur le code postal.
    Tu dois donc utiliser la 1ère solution :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT [routage].CP, [routage].PRENOM, "*" AS etoile
    FROM [routage]
    WHERE (Left([routage].CP,3)) In (SELECT Left([routage].CP,3) AS reg FROM [routage] GROUP BY Left([routage].CP,3)
    HAVING Count(*)>6)
    UNION SELECT [routage].CP, [routage].PRENOM, " " AS etoile
    FROM [routage]
    WHERE (Left([routage].CP,3)) Not In (SELECT Left([routage].CP,3) AS reg FROM [routage] GROUP BY Left([routage].CP,3)
    HAVING Count(*)>6)
    ORDER BY CP DESC;
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  12. #12
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Merci, du coup j'ai simplement changé le Not In et le <6 dans la deuxième et ça marche presque nickel !


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT [routage].CP, [routage].PRENOM, "*" AS etoile
    FROM [routage]
    WHERE (Left([routage].CP,3)) In (SELECT Left([routage].CP,3) AS reg FROM [routage] GROUP BY Left([routage].CP,3)
    HAVING Count(*)>6)
    UNION SELECT [routage].CP, [routage].PRENOM, " " AS etoile
    FROM [routage]
    WHERE (Left([routage].CP,3)) In (SELECT Left([routage].CP,3) AS reg FROM [routage] GROUP BY Left([routage].CP,3)
    HAVING Count(*)<6)
    ORDER BY CP DESC;

    Pour la troisième, et j’espère la dernière fois, merci encore !

  13. #13
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    ça marche presque nickel !
    Bonjour,
    peut-être pour enlever le "presque" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE (Left([routage].CP,3)) In (SELECT Left([routage].CP,3) AS reg FROM [routage] GROUP BY Left([routage].CP,3)
    HAVING Count(*)<=6)
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  14. #14
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Oui c'est ce que j'ai mis finalement.. Merci !

    Y a t'il un moyen de faire une requête "synthèse" de la première qui m'afficherait les résultat comme ceci :

    Regroupement CP Nombre d’occurrence
    210** 7
    695** 11
    951** 14

  15. #15
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonsoir
    oui c'est possible, mais pour plus de lisibilité, il faudrait d'abord enregistrer la requête, ensuite faire un regroupement sur les 3 premiers caractères du code postal et un compte (Count) pour finir. Cela sera plus facile car une fois enregistrée elle sera disponible via l'interface de création de requêtes assistée.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  16. #16
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    J'ai fait une seconde requête qui récupère les données triées de la première et j'ai mis regroupement et compteur mais je n'arrive pas à regrouper sur les 3 premiers caractères


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [CF par CP 6 seul].CP, Count([CF par CP 6 seul].CP) AS CompteDeCP
    FROM [CF par CP 6 seul]
    GROUP BY Left([CF par CP 6 seul].CP,3)
    ORDER BY [CF par CP 6 seul].CP DESC;

    quand je passe en mode feuille de donnée j'ai une erreur "requête ne comprenant pas l'expression 'CP' comme une partie de la fonction d'agregat"

    J'ai aussi tenté en ajoutant le tri de 3 caractères au Count(*) mais idem


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [CF par CP 6 seul].CP, Count(Left([CF par CP 6 seul].CP,3)) AS CompteDeCP
    FROM [CF par CP 6 seul]
    GROUP BY Left([CF par CP 6 seul].CP,3)
    ORDER BY [CF par CP 6 seul].CP DESC;

    Avec la requête simple, j'ai bien le compte mais regroupement sur le CP complet


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [CF par CP 6 seul].CP, Count([CF par CP 6 seul].CP) AS CompteDeCP
    FROM [CF par CP 6 seul]
    GROUP BY [CF par CP 6 seul].CP
    ORDER BY [CF par CP 6 seul].CP DESC;

    CP CompteDeCP
    97450 2
    97429 2
    97425 4
    97419 1
    92290 1
    92280 7
    92210 6
    92200 3
    92190 1

  17. #17
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonjour,
    si tu fais un group by sur un champ il doit obligatoirement faire partie du select. Remplace le [CF par CP 6 seul].CP par Left([CF CP 6 seul].CP,3) dans ton select et le problème sera réglé.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Grouper par dept avec le code postal
    Par philippefabre dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 29/07/2008, 16h24
  2. WebService Commune de france par code postal
    Par Nako_lito dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 04/07/2008, 16h19
  3. regrouper par groupe de valeur
    Par papilou86 dans le forum IHM
    Réponses: 2
    Dernier message: 23/01/2008, 21h16
  4. [Shell] Regrouper les lignes par groupe de trois
    Par bazouil29 dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 04/01/2008, 21h43
  5. recherche par code postal et ville
    Par ZEUSGR dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 30/11/2007, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo