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

MS SQL Server Discussion :

Priorisation selon résultat


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 46
    Par défaut Priorisation selon résultat
    Bonjour à tous,

    Je viens solliciter votre expertise sur SQL server.
    Allons tout de suite à mon problème de débutant, ma_table principale :

    record_id chain_id chain_n result
    1 A 0 occupé
    2 A 1 répondu
    3 A 2 Répondeur
    4 B 0 Personne
    5 B 1 Libre
    6 B 2 Sonné
    ......
    ......

    Pour une chain_id donnée, il y a 3 chain_n.
    Voici ma requête pour récupérer les enregistrements si un des 3 chain_n d'un chain_id donné, contient un résultat que j'aimerais avoir.
    Par exemple, si je veux savoir s'il y a des chain_id dont 1 des 3 chain_n contient le reésult = 'occupé', je fais la requête ci-dessous :

    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
    SELECT record_id,chain_id,chain_n,result
    FROM ma_table Rm
     
        where chain_id in (select chain_id from ma_table sR                            
     
                                where call_result = 'occupé' and 
                                  not exists (select * from ma_table Rx                                           
     
                                                where sR.chain_id = Rx.chain_id and Rx.result in ('parlé','chanté')
     
                                             )  
     
                          )
           group by record_id,chain_id,chain_n,result
      		 ;
    Le résultat retourne des record_id 1,2,3

    Jusque là tout va bien. J'aimerais maintenant prioriser sur result, avec ma requête précédente,
    si je veux avoir le résultat = 'occupé' mais si 1 des 2 autres chain_n contient le result qui est plus priorisé que 'occupé', ici en l'occurence 'Répondeur'
    ma requête ne devrait pas retourner les record_id 1,2,3


    TABLE_REF :

    RESULT VAL_PRIO
    Libre 4
    occupé 2
    Personne 3
    Répondeur 1
    répondu 5
    Sonné 6

    Et là, je ne sais pas comment m'y prendre
    J'espère d'être compréhensible.

  2. #2
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Vous ne voulez retourner que les statut d'appel les plus priorisé pour vous?

    Pouvez vous donner un exemple de ce que vous voulez obtenir?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 46
    Par défaut
    Merci iberserk pour votre réponse.

    J'essaie d'être clair :
    1 chain_id identique (qui contient 3 chain_n) ne peut être dissocié.

    Je m'explique, si je veux savoir quel(s) chain_id dont un(ou plusieurs) des trois chain_n contient result 'occupé'. Le résultat doit retourner les trois chain_n de cet chain_id.

    Dans ce cas, la requête dans mon poste précédent retourne le résultat ci-dessous :
    record_id chain_id chain_n result
    1 A 0 occupé
    2 A 1 répondu
    3 A 2 Répondeur



    Maintenant, dans ma 2eme table TABLE_REF contient la priorisation de result, ici on a
    'Répondeur' plus priorisé que 'Occupé' > 'Personne' >....

    Puisque Répondeur > occupé, donc le résultat ne doit plus retourner comme ci-dessus. Cette record_id 1,2,3 doit être exclu du résultat.

    J'espère que c'est plus clair

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Quelque chose comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.record_id, a.chain_id, a.chain_n, a.result
    FROM (ta_requête_précédante_ici_entre_parenthèse) a
    JOIN Table_Ref r on r.result=a.result
    ORDER BY a.chain_id, r.val_prio
    EDIT: en fait non, je crois que tu ne veux pas trier le résultat, mais supprimer chaque trio de records s'il s'avère qu'il devrait être retrié. Compliqué ça...

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Si j'ai bien compris, voici une solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT record_id,chain_id,chain_n,result
    FROM ma_table
    WHERE chain_id NOT IN
    (
     SELECT DISTINCT chain_id FROM ma_table a
      JOIN table_ref r ON r.result=a.result
      WHERE r.val_prio<
      (
       SELECT val_prio FROM table_ref WHERE result='occupé'
      )
    )

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 46
    Par défaut
    Merci camboui !!
    Avec ta 2eme requête, on est sur la bonne voie

    Puisque le décor est déjà planté, je ne veux pas ouvrir un autre poste,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select r.val_prio from MA_TABLE a 
    left JOIN table_ref r ON r.result=a.result
                  where chain_id in ('A','B' ) and result in('occupé','Répondeur') and max(r.val_prio);
    je voulais obtenir la valeur la plus priorisé d'un trio de records (= 1 chain_id) mais seulement quand result = valeurs en paramètre (result in('occupé','Répondeur'))

    Pour chain_id = A, parmi chain_n 0,1,2, je m'attends à obtenir 1 (dans le sens le plus priorisé, j'aurais du mêttre plus grand entier = plus grande priorité dans mon 1er poste).

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

Discussions similaires

  1. [AC-2003] Mise a jour table selon résultat requete
    Par toine38 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/11/2009, 13h43
  2. [MCD] Formation selon niveau (selon résultat du QCM)
    Par A.i.A dans le forum Schéma
    Réponses: 37
    Dernier message: 29/06/2009, 01h04
  3. Réponses: 19
    Dernier message: 03/02/2009, 10h52
  4. Afficher Cacher une phrase selon résultat du PHP
    Par FracMaster dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 16/05/2007, 13h20
  5. Page différente selon résultat requête
    Par philippef dans le forum Langage
    Réponses: 7
    Dernier message: 05/07/2006, 09h46

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