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 MySQL Discussion :

Cherche solution : COUNT puis addition des doublons


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mars 2015
    Messages : 16
    Points : 16
    Points
    16
    Par défaut Cherche solution : COUNT puis addition des doublons
    Bonjour à tous,

    Je débute sur ce forum, j'ai une requête toute bête pour vous j'en suis sûr, mais cela fait une journée que je cherche partout, et je ne trouve pas de réponse. Peut être que ma requête n'est pas basée sur la bonne fonction... J'ai 3 tables avec le même type d'informations dedans à savoir :

    • Première table : pictrel_paris


    référence Code Postal
    996458712456 78300
    987456125456 77050
    123456789787 75014
    456456789789 75013

    • Deuxième table : pictrel_est


    référence Code Postal
    455455788796 91200
    984512525456 78320
    121212121787 94450
    459999451225 92360

    • Et enfin, une troisième table : pictrel_ouest


    référence Code Postal
    455455788796 91200
    987456464656 94320
    145463688887 94450
    457878787879 94360

    J'ai fais la requête SQL suivante dans le but d'obtenir le nombre de références par département (ex: "77") :

    SELECT mid(`Code postal`,1,2) as CP, count(`Code postal`) as Nombre FROM `pictrel_est` group by mid(`Code postal`,1,2)
    UNION
    SELECT mid(`Code postal`,1,2) as CP, count(`Code postal`) as Nombre FROM `pictrel_ouest` group by mid(`Code postal`,1,2)
    UNION
    SELECT mid(`Code postal`,1,2) as CP, count(`Code postal`) as Nombre FROM `pictrel_paris` group by mid(`Code postal`,1,2)


    Qui me donne le résultat :

    CP Nombre
    78 1
    77 1
    75 2
    91 1
    78 1
    94 1
    92 1
    91 1
    94 3

    Le calcul est bien réalisé, aucun problème. Cependant, je souhaiterai qu'il m'additionne les lignes qui ont le même Code postal pour n'avoir qu'une ligne par code postal. Idéalement, il me faudrait :

    CP Nombre
    78 2
    77 1
    75 2
    91 2
    94 4
    92 1

    J'ai essayé de remplacer "Count" par "Sum", même résultat. Auriez -vous une idée qui puisse me sauver la vie?

    Je vous remercie par avance.

  2. #2
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour

    2 pistes :
    - faire la requête union sur les données brutes, puis appliquer une requete selection avec un count sur ce résultat. En bref

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
              mid(TU.`Code postal`,1,2) as CP_union, count(TU.`Code postal`) as Nombre_Union
    FROM 
          (SELECT `Code postal` as CP, `Code postal`as Nombre FROM `pictrel_est`
           UNION
           SELECT `Code postal` as CP, `Code postal`as Nombre FROM `pictrel_ouest`
           UNION
           SELECT `Code postal` as CP, `Code postal`as Nombre FROM `pictrel_paris`) as TU
     
    group by 
          mid(TU.`Code postal`,1,2)
    NB : je maîtrise très peu UNION, et pas encore correctement les sous requête, il faut donc voir l'idée.

    - pourquoi avoir 3 tables différentes? Ne pourriez vous pas faire une seule table avec une colonne "Zone"?

    Pierre

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 856
    Points : 52 992
    Points
    52 992
    Billets dans le blog
    6
    Par défaut
    Plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COUNT(macolonne) - COUNT(DISTINCT - macolonne)
    A +

  4. #4
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mars 2015
    Messages : 16
    Points : 16
    Points
    16
    Par défaut réponse de Liandar
    Coucou à tous,

    Avant tout, un grand merci pour vos réponses. Je vais de ce pas tester tout cela. Je vous dis ensuite si cela a fonctionné.

    En fait, j'ai réparti mes données dans 3 tables car les tableaux au dessus ne sont qu'un échantillon. En realité, chaque table a 63 colonnes et environ 200 000 lignes. Chaque semaine, j'incremente ~11 000 lignes dans chacun d'eux.

    J'ai peur qu'en réunissant les 3 tables (structures identiques), à chaque fois que je vais devoir requeter sur une zone geographique, SQL soit plus lent car il parcourra toutes les lignes de la table, soit 2/3 pour rien. Je me trompe ?

    Cordialement.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mars 2015
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par pier.antoine Voir le message
    Bonjour

    2 pistes :
    - faire la requête union sur les données brutes, puis appliquer une requete selection avec un count sur ce résultat. En bref

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
              mid(TU.`Code postal`,1,2) as CP_union, count(TU.`Code postal`) as Nombre_Union
    FROM 
          (SELECT `Code postal` as CP, `Code postal`as Nombre FROM `pictrel_est`
           UNION
           SELECT `Code postal` as CP, `Code postal`as Nombre FROM `pictrel_ouest`
           UNION
           SELECT `Code postal` as CP, `Code postal`as Nombre FROM `pictrel_paris`) as TU
     
    group by 
          mid(TU.`Code postal`,1,2)
    NB : je maîtrise très peu UNION, et pas encore correctement les sous requête, il faut donc voir l'idée.

    - pourquoi avoir 3 tables différentes? Ne pourriez vous pas faire une seule table avec une colonne "Zone"?

    Pierre
    Re,

    Alors , J'ai compris ce que tu cherchais à faire, à savoir, concaténer nos données dans le FROM pour ensuite traiter avec le SELECT.
    Malheureusement, MySQL me répond cela :

    #1054 - Unknown column 'TU.Code postal' in 'field list'

    En fait, il ne reconnais pas le "TU". L'erreur doit sans doute venir du FROM, le UNION ne peut peut être pas se faire dans un FROM..
    L'idée était top en tout cas. Merci quand même

  6. #6
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mars 2015
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COUNT(macolonne) - COUNT(DISTINCT - macolonne)
    A +
    Re SQLPro,

    Alors j'ai testé comme cela :

    SELECT mid(`Code postal`,1,2) as CP, count(`Code postal`)-count(distinct `Code postal`) as Nombre FROM `pictrel_est` group by mid(`Code postal`,1,2)
    UNION
    SELECT mid(`Code postal`,1,2) as CP, count(`Code postal`)-count(distinct `Code postal`) as Nombre FROM `pictrel_ouest` group by mid(`Code postal`,1,2)
    UNION
    SELECT mid(`Code postal`,1,2) as CP, count(`Code postal`)-count(distinct `Code postal`) as Nombre FROM `pictrel_paris` group by mid(`Code postal`,1,2)


    Mais le DISTINCT ne fonctionne que pour le SELECT en cours, donc, chacun des 3 SELECT renvoi des données uniques, mais une ligne se trouvant dans la table1 existe aussi dans la table2.

    Cela me renvoi donc en résultat final mes deux lignes identiques (comme ma requête originale en fait).

    Il faudrait que je trouve le moyen de réunir mes 3 tables pour appliquer le COUNT après.

    Du coup, je ne trouve toujours pas ma solution héhé.. Ca me parait si simple pourtant, je rage de ne pas trouver.

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Reprenez la requête proposée par pier.antoine
    http://www.developpez.net/forums/d15...s/#post8353387

    Mais utilisez UNION ALL car UNION fait un DISTINCT, l'inverse de votre besoin.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Pour en revenir à la question sur la structure, séparer les 3 tables n'est sans doute pas la meilleure affaire que tu aies faites...
    Si tu veux faire du fractionnement horizontal, tu peux te servir des partitions (http://krierjon.developpez.com/mysql/partitionnement/)
    Eventuellement le moteur MERGE (http://sony-noel.developpez.com/tuto...rs/?page=merge) si tu es en MyISAM.

    Et pour ta question sur la requête, si tu faisais claquer un petit script de création de tables + insertion des données, ça aiderait...

    A+

  9. #9
    Invité
    Invité(e)
    Par défaut
    Re,

    Et pour ton erreur #1054 - Unknown column 'TU.Code postal' in 'field list'
    Tu as aliasé tes colonnes dans le FROM
    Donc tu dois te servir de ces alias dans le SELECT !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
     mid(TU.CP,1,2) as CP_union, count(TU.CP) as Nombre_Union
    FROM 
     (SELECT `Code postal` as CP, `Code postal`as Nombre FROM `pictrel_est`
     UNION
     ...
     ) AS TU

  10. #10
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mars 2015
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Et voila, solution trouvée ! Un grand merci pour votre contribution.
    Je m'explique :

    LA requête correcte est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
              mid(TU.CP,1,2) as CP_union, count(TU.CP) as Nombre_Union
    FROM 
          (SELECT `Code postal` as CP, `Code postal`as Nombre FROM `pictrel_est`
           UNION ALL
           SELECT `Code postal` as CP, `Code postal`as Nombre FROM `pictrel_ouest`
           UNION ALL
           SELECT `Code postal` as CP, `Code postal`as Nombre FROM `pictrel_paris`) as TU
     
    group by 
          mid(TU.CP,1,2)


    Effectivement, en faisant ainsi, pour le SELECT, il fallait mettre l'allias utilisé, à savoir "CP" et non pas le nom du champ initial `Code postal`.
    Le UNION ALL a également toute son importance. Sans celui-ci, ça ne fonctionne pas.

    Merci encore à tous et merci à Nenex73, c'est tes derniers messages qui m'ont aidé à finaliser la requête.
    Je procède déjà en faisant un fractionnement horizontal. C'est d'ailleurs pour cela que j'ai 3 fichiers et non pas 1.

    Sujet résolu. Merci !

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ravi t'avoir pu aider.

    Mais jette un oeil sur le partitionnement.
    L'avantage de la faire gérer par MySQL plutôt qu'à la mano c'est que - tu obtiens l'avantage de perf que tu recherches (même si je pense qu'avant que tu vois la différence sur le temps d'exécution, ton fichier va devoir enfler encore un gros gros poil) - tu n'as rien à gérer pour le "réassemblage". C'est le moteur qui connait la clé de répartition et utilise les partitions en conséquence.
    En revanche, les perf des requêtes utilisant plusieurs partoches sont forcément moins bonnes...

    Bonne soirée.

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

Discussions similaires

  1. [XL-2003] Contrôle des doublons sur plusieurs feuilles, puis suppression
    Par DeathLighT dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 04/03/2013, 12h14
  2. Cherche solution d'archivage des applications "mortes"
    Par pierre031183 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 15/06/2011, 16h24
  3. Cherche solution d'archivage des applications "mortes"
    Par pierre031183 dans le forum Autres Solutions d'entreprise
    Réponses: 1
    Dernier message: 15/06/2011, 16h19
  4. Réponses: 3
    Dernier message: 20/03/2008, 12h02

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