Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 28/03/2011, 19h53   #1
Membre émérite
 
Inscription : mai 2006
Messages : 787
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 787
Points : 837
Points : 837
Par défaut [SQL Server2008] Criteres de classement

Bonjour,

Je cherche à obtenir d'une table les enregistrements par type mais selon certains criteres.

Un exemple valant mieux que mille mots, j'ai une table :
Code :
1
2
3
4
5
6
7
 
ID          MONTYPE       ETAT         NUM
1           1               0              1
2           1               1              2
3           1               1              3
4           2               1              1
5           2               0              2
Sachant que le couple (MONTYPE, NUM) est unique, je cherche à obtenir tous les enregistrements classés par MONTYPE/NUM tant que l'etat n'est pas 1.

Dans mon exemple, ca revient à obtenir :
Code :
1
2
3
4
5
 
ID          MONTYPE       ETAT         NUM
1           1               0              1
2           1               1              2
4           2               1              1
Je pense pouvoir reussir en passant par une table temporaire mais je viens vers vous pour savoir si quelqu'un n'aurait pas une solution plus simple (à coup de RANK, ROW_NUMBER ou autre)...

Merci
hwoarang est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 20h10   #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
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
SELECT T1.ID,
       T1.MONTYPE,
       T1.ETAT,
       T1.NUM
 FROM TABLE T1
WHERE NOT EXISTS(SELECT *
                            FROM TABLE T2
                            WHERE T2.MONTYPE=T1.MONTYPE
                              AND T2.NUM=T1.NUM 
                              AND T2.ETAT=1
                              AND T2.ID<T1.ID)
ORDER BY T1.MONTYPE,T1.NUM
__________________
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 28/03/2011, 21h58   #3
Membre émérite
 
Inscription : mai 2006
Messages : 787
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 787
Points : 837
Points : 837
Merci pour ta réponse. Malheureusement, j'avais pensé à ce genre de requete mais ca m'oblige a passer par une table intermediaire (la table que j'ai présenté est en fait issue d'une requete).

Il n'y a pas une methode plus simple ? Sinon, tant pis, je passerais par une variable table...
hwoarang est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 07h58   #4
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
On peut également passer par ROWINDEX...

Postez l'intégralité de la requête...

Si c'est un problème de lisibilité vous pouvez également pensez à créer des vues...
__________________
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 29/03/2011, 09h08   #5
Membre émérite
 
Inscription : mai 2006
Messages : 787
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 787
Points : 837
Points : 837
Oui, c'est un probleme de lisibilité. La requete en elle meme n'est pas compliquée mais un peu imposante. Et si je dois la faire 2 fois, elle va devenir franchement illisible. C'est vrai, je pourrais utiliser une vue. Mais autant passer par une table temporaire dans ce cas (c'est moins les performances que la lisibilité qui m'interesse).

Merci
hwoarang est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 09h23   #6
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
Citation:
Oui, c'est un probleme de lisibilité. La requete en elle meme n'est pas compliquée mais un peu imposante. Et si je dois la faire 2 fois, elle va devenir franchement illisible. C'est vrai, je pourrais utiliser une vue. Mais autant passer par une table temporaire dans ce cas (c'est moins les performances que la lisibilité qui m'interesse)
Façon de voir les choses...
__________________
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 29/03/2011, 13h15   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Effectivement, en postant le vrai modele, et eventuellement la requete que vous avez deja faite, ce serait plus simple

Sinon, pour votre problème de factorisation de code, si vous ne pouvez/voulez pas passer par une vue, pensez aux expression de table commune :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
 
;WITH tmp AS (
	[votre requete]
)
SELECT [MesColonnes]
FROM tmp t1
INNER JOIN tmp t2 ON [MaJointure]
WHERE EXISTS ( 
	SELECT *
	FROM tmp t3
)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h59.


 
 
 
 
Partenaires

Hébergement Web