Problème de Requête Sql : je n'y arrive pas.

nicojojo -  
 nicojojo -
Bonjour,

Voilà j'ai une table de ce type :

Colonne 1 | Colonne 2
1 | x
2 | x
12 | x


et je dois affecter la plus petite valeur de la colonne 1 (qui est donc 1) à tous les autres champs de la colonne 1 qui ont un enregistrement x en colonne 2. Je n'arrive pas à trouver la requête UPDATE correspondante. Peut-être auriez vous une idée ?

Je suis sous SQL serveur.

J'ai un début ; UPDATE PERSONNEL SET IDPERSPOSTE=MIN(IDPERSPOSTE) WHERE ... Mais après je sais plus. D'ailleurs le début est pas forcément bon non plus.

2 réponses

Morgothal Messages postés 1236 Date d'inscription   Statut Membre Dernière intervention   183
 
Hello,
Je ne comprends pas bien à tous les autres champs de la colonne 1, une colonne a des champs ?

Est-ce que la demande correspond à cet exemple :
on part de :
Colonne1 | Colonne2
1 | X
2 | X
3 | Y
4 | Y
5 | X
6 | X
pour arriver à :
Colonne1 | Colonne2
1 | X
1 | X
3 | Y
4 | Y
1 | X
1 | X

J'ai bien saisi ?
0
nicojojo
 
Merci beaucoup Morgothal,

Et bien, oui c'est bien ce que tu as décris pour X...

Mais c'est malheureusement encore plus compliqué, car le problème et que cela doit AUSSI effectuer le même traitement pour Y et pour Z et pour + l'infini !
( C'est à dire que si la valeur minimale de Z est 2 par exemple, et bien chaque champ de la colonne 1 associée à {colonne2->Z} doit être updatée avec la valeur 2 !)

Ourgh, c'est quand même assez complexe non ?
0
Morgothal Messages postés 1236 Date d'inscription   Statut Membre Dernière intervention   183
 
Ça se complexifie oui :-)
J'y réfléchis un peu et je te poste une requête exemple !

Juste une question, ce traitement c'est pour un besoin ponctuel ou quelque chose de plus régulier ?
0
nicojojo
 
Non c'est ponctuel, pour corriger un bug qui a altéré une base de donnée...

En fait, il faut attribuer les valeurs de la colonne 1 en fonction de l'enregistrement de valeur mini "associé" au champs de la colonne 2. C'est dur à exprimer pour moi.

Tiens, je viens de penser à un truc ...
Peut être faire une recherche des valeurs mini pour chaque enregistrement de la colonne 2 dans un premier temps, puis faire le update à l'aide de ces données..
0
Morgothal Messages postés 1236 Date d'inscription   Statut Membre Dernière intervention   183
 
Re,
Je ne vois que maintenant ton commentaire, mais oui c'est exactement ce que je fais :-)

Voilà la requête qui te permet d'avoir le minimum pour chaque valeur de la colonne 2 dans une table temporaire ##temptable, j'ai appelé ma table de valeurs d'entrée CSD_TEST(colonne1, colonne2)
(désolé c'est sans indentation ni majuscules, j'ai fait ça sur un coin de table vite fait ^^) :

create table ##temptable (mincol1 int, col2 varchar(1))
insert into ##temptable(col2) select distinct colonne2 from csd_test

DECLARE @var varchar(1)
DECLARE curseur CURSOR FOR SELECT col2 FROM ##temptable
OPEN curseur
FETCH curseur INTO @var
WHILE @@FETCH_STATUS = 0
BEGIN
--------------------------
update ##temptable set mincol1 = (select MIN(colonne1) from csd_test where colonne2 = col2) where col2 = @var
--------------------------
FETCH curseur INTO @var
END
CLOSE curseur
DEALLOCATE curseur

select * from csd_test
select * from ##temptable
drop table ##temptable

Tu dis si c'est ok !

A+
0
Morgothal Messages postés 1236 Date d'inscription   Statut Membre Dernière intervention   183
 
Et du coup, il ne te reste qu'à update ta table (ici CSD_TEST) avec la table temporaire ainsi obtenue !
0
nicojojo
 
OK merci, je teste et je te dit merci.
0