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 :

choisir un seul résultat selon un critère pouvant prendre 3 valeurs


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Points : 21
    Points
    21
    Par défaut choisir un seul résultat selon un critère pouvant prendre 3 valeurs
    salut.
    Je suis un peu perdu face à une requete qui me parait simple à formuler mais dont je n'arrive pas à trouver la syntaxe.

    1) mise en place du problème:
    Je travaille sur la mise à jour d'une base de donnée concernant les transports.




    afin d'automatiser la recherche de la destination pour une ligne j'ai créé une typologie particulière:
    * la ligne possède deux sens (1,2)
    * la ligne peut comporte plusieures branches (champ brch_M)
    par ex: 0-------1-----@---2--@

    ou encore
    0--------1-------@
    |_____2______@

    * un arret qui est le terminus d'une ligne possède un attribut terminus associé au doublé numéro de station et numéro de ligne et au doublé sens et branche (table passe par)

    2) Mon problème est le suivant:
    Je désire pour chaque station savoir quelle est la "direction principale" de celui-ci, c'est à dire le terminus d'une des lignes la traversant selon certaines conditions.

    * J'ai créé une requête m'indiquant les lignes et les terminus de celles-ci.
    * j'ai créé une requête me donnant pour chaque station les lignes qui la traverse.
    *en associant ces deux requetes, j'obtiens une table comportant pour chaque station, les ligne la traversant, son type et les terminus de ces lignes.

    Un arret peut etre desservit par plusieurs lignes, lignes dont le type (typ_lig) peut prendre 3 valeurs: "Struct", "no_struct", "taxi".

    Je veux créer une requête me donnant:
    Pour un arret, si celui-ci est traversé par
    1 ou * ligne structurante, en choisir une et me renvoyer son terminus
    sinon
    1 ou * ligne non structurante, en choisir une et me renvoyer son terminus
    sinon
    1 ou * ligne taxi en choisir une et me renvoyer son terminus

    Je pensais à une requete de type SELECT TOP 1 ou LIMIT 1 et une imbrication de clauses iif et Exist, mais la syntaxe m'échappe.

    * J'ai créé une requête m'indiquant les lignes et les terminus de celles-ci.
    * j'ai créé une requête me donnant pour chaque station les lignes qui la traverse.
    *en associant ces deux requetes, j'obtiens une table comportant pour chaque station, les ligne la traversant, le types et la "direction" de chaque ligne.

    Merci de l'aide que vous pourrez m'apporter et n'hésitez pas à me demander des renseignements complementaires pour faire avancer le schimili... schimiliblli... oh et puis zut

  2. #2
    Expert éminent sénior
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Bjr,

    Pour gérer la priorité dans le choix du type de ligne il faut ajouter un champ de priorité:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Priorite : (typ_lig="Struct") * -1 + (typ_lig="no_struct")*-2 + (typ_lig="taxi") * -3

    Edit: si tu as déjà une petite table avec la liste des type de ligne, ajouter la priorité dans cette table et la joindre à la requête serait sans doute mieux que ce calcul.

    Le champ priorité vaut donc :
    1 pour une ligne structurante
    2 pour une ligne non structurante
    3 pour une ligne taxi

    Ajoute ensuite un tri ascendant sur cette priorité.
    On a donc dans l'ordre les lignes structurantes, puis les lignes non structurantes, et enfin les lignes taxi.

    Et enfin ne garde que le premier avec TOP 1.

    Ca marche??

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Une fois le critère priorité rajouté à la table ligne et récupéré dans ma requête finale, j'ai mis comme premier critère de selection priorité trié par ordre croissant et rajouté TOP 1 à la requete SQL.

    le problème c'est qu'il me renvoie les lignes dont la priorité est à un. quand il y en a plusieurs par station, je retrouve plusieurs fois le numéro de la station. Je suis en train de faire des essais sur les tris pour que cela fonctionne correctement.

    Je dois modifier en premier lieu ma requete:
    "numero de station renvoie les numéros et autres infos sur les lignes"

    le problème c'est que la clause TOP 1 tronque completement les données renvoyées.
    * si je ne spécifie aucun numéro de station, la requete me renvoie une seule station (la première) avec une seule ligne.
    * Si je specifie un numéro de station, il me renvoie tous les numéro de ligne passant en priorité

    Je pense qu'une table intermediaire s'impose.
    table intermédiaire:
    numéro de station (trié par ordre croissant)
    numéro de ligne
    priorité (trié par ordre croissant)

    ensuite je pourrais aller piocher dans cette table selon mon numéro de station, obtenir les numéro de ligne trié en fonction de la priorité et n'en choisir qu'un avec top 1.

    J'ai un peu peur de tourner en rond. mais c'est pas grave

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Points : 21
    Points
    21
    Par défaut un peu d'eau au moulin
    J'ai créé une requete qui me renvoie pour chaque numéro de station la plus petite valeur de priorité (pour mémoire plus le chiffre est petit, plus la ligne est structurante).

    En SQL cela donne la requête suivante (on la nommera requete 1):
    SELECT [PassePar].num_sta, Min([ligne].Priorite) AS lig_prior
    FROM ligne INNER JOIN PassePar ON [ligne].num_lig = [PassePar].num_lig
    GROUP BY [PassePar].num_sta
    ORDER BY [PassePar].num_sta, Min([Ligne].Priorite);
    Par contre il m'est impossible d'inclure cette requete dans une autre. Je voulais l'inclure dans une requete qui permettrait d'avoir la premiere occurence de ligne dont la priorité est égale au résultat de la requete 1.

    il me renvoie le message d'erreur : "cette sous-requete peut retourner au plus un enregistrement".
    Justement c'est ce que je veux, obtenir la priorité de la ligne la plus structurante, une seule fois puis obtenir juste une ligne correspondante à cette priorité.

    Pour l'instant ma solution est de creer une table non temporaire à partir de la requête 1 puis de lier cette table avec les tables PassePar (sur numlig) et sur la table ligne (sur priorité). J'ai l'impression que cela me donne un résultat correct: un couple unique station ligne dont la priorité correspond à ma table.
    Seul problème: la mise à jour de cette table intermédiaire qui ne se fait pas de manière dynamique.

    Je recherche actuellement mon erreur afin de ne pas passer par une table intermédiaire

  5. #5
    Expert éminent sénior
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    BJr,

    Je ne comprend pas bien ce que tu souhaites faire.
    Peut-être qu'on y verrait plus clair avec le SQL de tes requêtes et un petit exemple?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    désolé de ne pas avoir continué la discussion. le problème était assez compliqué et j'ai pensé renoncer.
    Malgré tout, j'ai finit par trouver une solution (peu optimisée mais bon): emboiter differentes requêtes traitant une partie particulière du problème à chaque fois:
    * trouver la priorité maximum présente sur une station
    * grâce à la requête precedente, sélectionner une seule ligne sur toutes celles correspondant à la priorité max et passant par la station (donne numéro de ligne, sens et branche sur la station en question)

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [passepar].num_sta, First([passepar].num_lig) AS PremierDenum_lig
    FROM ligne INNER JOIN ([@PriorMaxLigneParStation] INNER JOIN passepar ON [@PriorMaxLigneParStation].num_sta=[ligne].num_sta) ON ([ligne].Priorite=[@PriorMaxLigneParStation].lig_prior) AND ([ligne].num_lig=[passepar].num_lig)
    GROUP BY [passepar].num_sta;

    * une requête qui pour chaque ligne me donne le terminus en fonction du sens et de la branche. ces trois critères (ligne, sens, branche) sont renseignés avec les résultats de la requête précédente et j'obtiens le nom de mon terminus.

    en tout cas merci arkham46 pour l'indice que tu m'as donné. Cela m'as permis d'organiser intelligemment mes lignes et d'obtenir un résultat correct.

    Ouf, tout ça pour ça.

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

Discussions similaires

  1. [XL-2010] Apparition d'une seule colonne selon critère
    Par PIETHI dans le forum Excel
    Réponses: 1
    Dernier message: 13/11/2013, 13h07
  2. variable pouvant prendre des valeurs définies
    Par buzz73 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 30/12/2008, 12h53
  3. Réponses: 5
    Dernier message: 15/10/2008, 10h08
  4. Trier résultats selon un critère
    Par jersey_girl dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/09/2006, 10h43
  5. Afficher un enregistrement selon un critère saisie.
    Par pegase23 dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 11h54

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