S.O.S Vue compliquée recherche solution desespérément!

universaliss Messages postés 5 Date d'inscription samedi 23 août 2008 Statut Membre Dernière intervention 17 mars 2011 - 6 oct. 2010 à 14:42
tri_yann Messages postés 124 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 19 septembre 2013 - 15 avril 2012 à 10:04
Bonjour je sollicite votre aide pour un petit problème de requête au sein d'une vue.

J'espère que ce genre de problème n'a pas déjà été posé auquel cas je ne l'ai pas trouvé dans la recherche et je remercie d'avance celui qui me redirigera dessus.
Je tiens absolument a écrire une vue qui,
après moult requête renvoie la table de résultat suivant
id..valeur. type
1 .. 56 1
1 .. 60 2
2 .. 45 2
2 .. 45 3
2 .. 49 4
3 .. 12 2
4 .. 59 5
4 .. 14 6
le tout sur 100 000 lignes.

Je souhaiterai obtenir dans ma vue seulement 1 et un seul tuple par id correspondant au type le plus petit existant pour cet id.
donc
1 56 1
2 45 2
3 12 2
4 59 14
sur le nombre d'id.

Il existe la solution pour chaque tuple de faire un "select top ......order by type asc"
mais là je souhaite avoir le résultat pour l'ensemble des id de la table.

Enfin comme si ça ne suffisait pas, pour des raisons technique je ne peux me servir des curseurs (pas de boucles)
et étant dans la création d'une vue je dois aussi me passer de fonctions.

S'il existe ici des magiciens du sql qu'il se dénoncent et me vienne en aide!

Merci d'avance.

3 réponses

cs_Tolliap Messages postés 60 Date d'inscription lundi 4 décembre 2006 Statut Membre Dernière intervention 11 janvier 2013
9 oct. 2010 à 01:17
Voici une solution qui fonctionne :

table que j'ai créé pour met test :
CREATE TABLE dbo.test ( 
    id    	int NOT NULL,
    valeur	varchar(25) NULL,
    type  	int IDENTITY(1,1) NOT NULL 
    )

Voici la requete :

select id,valeur,type from (
select id,valeur,type,ROW_NUMBER() OVER(PARTITION BY id ORDER BY valeur asc) AS 'nb' from test) as R
where nb=1


Qui ne tente rien, n'a rien
0
cs_gogniol Messages postés 7 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 7 mai 2011 1
12 oct. 2010 à 11:28
Bonjour,

Tolliap, au vu de l'énoncé le ORDER BY est sur le type et non sir l'ID.
La requete devient :

select id,valeur,type from (
select id,valeur,type,ROW_NUMBER() OVER(PARTITION BY id ORDER BY type asc) AS 'nb' from test) as R
where nb=1


Et voici une autre métode :

select A.id,A.valeur,A.type from test A
inner join (select id,min(type) type from test group by id) B
on B.id=A.id and B.type=A.type


Les deux requetes donnent le même résultat.

Codialement
0
tri_yann Messages postés 124 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 19 septembre 2013 3
15 avril 2012 à 10:04
Bonjour,

Il faut dissocier en 2 requêtes. Une qui compte par Id et une qui prend le min.
SELECT A.Id, B.Valeur, Count(A.Id) as NbId
FROM [MaTable] A INNER JOIN  
(SELECT Id, Min(Valeur) as valeur FROM [MaTable] GROUP BY Id) B
ON A.Id B.Id and A.Valeur B.Valeur
GROUP BY A.Id, B.Valeur


Affichage d'un enr par Id avec le min de Valeur et le nombre d'enr de cet Id ayant le min de valeur.

Yann
0
Rejoignez-nous