Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/08/2011, 15h37   #1
Invité régulier
 
Inscription : août 2008
Messages : 46
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 46
Points : 8
Points : 8
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 :
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.
WillyPayne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 08h57   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
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?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 10h28   #3
Invité régulier
 
Inscription : août 2008
Messages : 46
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 46
Points : 8
Points : 8
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
WillyPayne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 14h53   #4
Membre éprouvé
 
Inscription : avril 2005
Messages : 884
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 884
Points : 431
Points : 431
Quelque chose comme ceci ?
Code :
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...
camboui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 15h20   #5
Membre éprouvé
 
Inscription : avril 2005
Messages : 884
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 884
Points : 431
Points : 431
Si j'ai bien compris, voici une solution
Code :
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é'
  )
)
camboui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 18h15   #6
Invité régulier
 
Inscription : août 2008
Messages : 46
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 46
Points : 8
Points : 8
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 :
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).
WillyPayne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 10h53   #7
Membre éprouvé
 
Inscription : avril 2005
Messages : 884
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 884
Points : 431
Points : 431
Tu mets le résultat de ma requête dans une table temporaire, requête executée pour chaque valeur result voulue.

Ensuite tu ne gardes qu'un des chain_id qui t'intéresse sur base de la priorité que tu as définie. Va voir une récente discussion à ce sujet:
http://www.developpez.net/forums/d11...ntiques-table/
camboui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 18h14   #8
Invité régulier
 
Inscription : août 2008
Messages : 46
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 46
Points : 8
Points : 8
Merci beaucoup camboui pour tes aides précieuses !
J'ai pu trouver ce que je voulais.

Je mets la solution à mon poste précédent :

Code :
1
2
3
SELECT max(r.val_prio),chain_id FROM MA_TABLE a 
LEFT JOIN table_ref r ON r.result=a.result
              WHERE AND result IN('occupé','Répondeur') GROUP BY chain_id;
WillyPayne est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h44.


 
 
 
 
Partenaires

Hébergement Web