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

Langage SQL Discussion :

Besoin d'aide pour écrire une requête


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut Besoin d'aide pour écrire une requête
    Salut à toutes et à tous,

    Je suis face à deux problèmes qui, j'en suis sur, sont solvables chacun en une requête sql, mais j'avoue avoir du mal à l'établir.

    Soit une table contenant un champs de numéros de lots et un champs de centoïde(s).

    Exemple :
    NumLot | Centroide
    ------------------------
    4 000 000 | 17-12
    4 000 000 | 17-13
    4 000 000 | 17-12
    4 000 000 | 17-14;17-15
    4 000 000 | 17-16
    4 000 001 | 17-17
    4 000 002 | 18-1
    4 000 002 | 18-2
    4 000 002 | 17-12
    4 000 003 | 1-4,12-4
    4 000 004 | 1-1
    4 000 005 | 2-14
    4 000 005 | 2-14
    4 000 005 | 2-14


    Problème 1 :
    Un lots peut contenir plusieurs centroïdes et un centroïde peut se retrouver plusieurs fois dans un lot, mais un centroïde ne peut jamais se trouver dans plusieurs lots.
    Il me faut donc sortir une liste des centroïdes qui sont présents dans plusieurs lots, et sortir les lots dans lesquels ils sont.
    L'exemple ci-dessus, suite à la requête SQL, devrait sortir ceci :
    Centroide | NumLot
    -----------------------
    17-12 | 4 000 000
    17-12 | 4 000 002


    Problème 2 :
    Il me faut sortir la liste de tous les lot contenant plusieurs centroïdes différents, avec la liste de ceux-ci par lot. Ici le problème est de trouver les lots qui contiennent plusieurs centroïdes en sachant que plusieurs centroïdes peuvent aussi être sur la même ligne séparés soit par un point-virgule soit par une virgule.
    Par contre un lot contenant plusieurs lignes de centroide mais toujours le même ne devraient pas sortir.

    Le résultat ici serait :
    NumLot | Centroide
    ------------------------
    4 000 000 | 17-12
    4 000 000 | 17-13
    4 000 000 | 17-12
    4 000 000 | 17-14;17-15
    4 000 000 | 17-16
    4 000 002 | 18-1
    4 000 002 | 18-2
    4 000 002 | 17-12
    4 000 003 | 1-4,12-4

    On remarque ici que 4 000 001, 4 000 004 et 4 000 005 ont disparu car ils ne contenaient qu'un centroide.

    Ca fait un bout de temps que je rame, aussi je fais appel à votre science.

    Merci de vos z'avis z'avisés,
    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  2. #2
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    Votre champ centroide n'est pas atomique. Par conséquent votre modèle ne respecte pas la première forme normale.

    Il s'ensuit des requêtes complexes à écrire et des problèmes de performance.
    Je vous conseille de revoir votre modèle de données sinon, vous serez constamment en train d'essayer de faire passer un cylindre dans un trou carré.

    Cordialement,

    Arkhena
    A bove ante, ab asino retro, a stulto undique caveto

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Bonjour et merci de ton aide Arkhena,

    Malheureusement je ne peux pas modifier la structure ni le type de données parce que la base de données est une base de donnée access venant d'un fournisseur externe.

    Je suis en train de monter un tout nouveau modèle sans ce problème et sans bien d'autres (en postgreSQL ce qui m'évite certaines limitations d'access). Le projet a été proposé aux fournisseurs et ils voient aussi l'intérêt du développement d'un nouveau modèle évitant toute une série d'écueils. Toutefois les projets ne peuvent être arrêtés ni recommencés à 0. Il me faut donc vivre avec le passé et tanter, tant bien que mal, de résoudre les problèmes encore pendant plusieurs mois.

    Cela dit, le fait d'écrire mes questions ici autrement que ce que je ne l'avais fais sur papier jusqu'à présent m'a permis de trouver une solution au problème 2. Je l'expose ci-dessous.

    Le problème 1 reste toujours entier jusqu'à présent.

    JM

    Une solution au problème 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT GRCO.NOUV_LOT, GRCO.CENTROID
    FROM GRCO
    WHERE GRCO.NOUV_LOT In 
        (SELECT tmp.NOUV_LOT
          FROM (SELECT GRCO.NOUV_LOT, 
                       GRCO.CENTROID, 
                       IIf(GRCO.CENTROID Like '*[;,]*',2,1) AS Nbr
                FROM GRCO
                GROUP BY GRCO.NOUV_LOT, GRCO.CENTROID) AS tmp
          GROUP BY tmp.NOUV_LOT
          HAVING Sum(tmp.Nbr)>1)
    ORDER BY GRCO.NOUV_LOT, GRCO.CENTROID;
    Explication :
    1. Une sous-sous-requête a pour but de regrouper lots et leurs centroïdes
    2. Une sous-requête place un 1 dans un champs si le centroïde groupé ne contient pas de virgule ou point-virgule. Sinon on met un 2 car si il y a un point virgule ou une virgule il y a au moins 2 centroïdes dans le lot
    3. La requête sort les lots et les centroïdes pour les lots dont la somme des valeurs déterminées au point 2 sont plus grandes que 1.
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Dans le même ordre d'idée, une solution pour le problème 1.

    Pour ceux à qui le problème pourrait arriver aussi.

    JM

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    SELECT CENTROID, 
           NOUV_LOT
    FROM (SELECT GRCO.CENTROID, 
                 GRCO.NOUV_LOT 
          FROM GRCO 
          GROUP BY GRCO.CENTROID, 
                   GRCO.NOUV_LOT
         ) AS Tmp
    WHERE CENTROID In (SELECT CENTROID 
                       FROM (SELECT GRCO.CENTROID, 
                                    GRCO.NOUV_LOT 
                             FROM GRCO 
                             GROUP BY GRCO.CENTROID, 
                                   GRCO.NOUV_LOT
                            ) As Tmp 
                       GROUP BY CENTROID 
                       HAVING Count(CENTROID)>1)
    ORDER BY CENTROID, 
             NOUV_LOT;
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

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

Discussions similaires

  1. Besoin d'aide pour écrire une requête SQL
    Par tompintures dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/01/2011, 10h47
  2. [MySQL] besoin d'aide pour exécuter une requête et en récupérer le résultat
    Par fast462 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 28/05/2007, 10h30
  3. besoin d 'aide pour formuler une requête
    Par cdu dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/04/2006, 19h38
  4. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 09h41
  5. Aide pour écrire une requête complexe
    Par julienbdx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/11/2005, 16h58

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