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

  1. Morgothal Messages postés 1350 Statut Membre 184
     
    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
    1. 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
    2. Morgothal Messages postés 1350 Statut Membre 184
       
      Ç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
    3. 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
  2. Morgothal Messages postés 1350 Statut Membre 184
     
    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
    1. Morgothal Messages postés 1350 Statut Membre 184
       
      Et du coup, il ne te reste qu'à update ta table (ici CSD_TEST) avec la table temporaire ainsi obtenue !
      0
    2. nicojojo
       
      OK merci, je teste et je te dit merci.
      0