OVH Cloud OVH Cloud

sélectionner la valeur du chamnp précédent

5 réponses
Avatar
pat
Bonjour,

J'ai une table

OF OP autres champs
1 10
1 50
1 20
2 5
2 10
2 100
2 45
5 50
5 100
3 10

La cle praire est OF / OP.

Je dois r=E9cup=E9rer le champ OP pr=E9c=E9dent pour chaque couple OF/OP.

Ce qui donnerait :

OF OP autres champs OP PRECEDENT
1 10 NULL
1 50 10
1 20 20
2 5 NULL
2 10 5
2 100 10
2 45 45
5 50 NULL
5 100 50
3 10 NULL

Par un curseur, je sais faire mais un post pr=E9c=E9dent m'a d=E9montr=E9
qu'en maitrisant le langage sql on pouvait faire beaucoup de choses
sans curseur et avec une meilleure efficacit=E9.

A votre bon coeur!

5 réponses

Avatar
Med Bouchenafa
Toute la difficulté est de savoir ce que tu entends par "précédent"
SQL n'a pas d'ordre prédefini autre que par la clause ORDER BY
Tu peux t'inspirer la requête suivante.
SELECT B.OF, B.OP , PRECEDENT=(SELECT MAX(A.OP) FROM tblTest A WHERE
B.OP>A.OP AND A.OF=B.OF)
FROM tblTest B
Elle n'utilise certes pas pas le mot CURSOR, mais elle effectue un
traitement en cursor
il faut travailler la clause WHERE de la table A pour specifier plus
précisement le "précedent"

--
Bien cordialement
Med Bouchenafa

"pat" a écrit dans le message de news:

Bonjour,

J'ai une table

OF OP autres champs
1 10
1 50
1 20
2 5
2 10
2 100
2 45
5 50
5 100
3 10

La cle praire est OF / OP.

Je dois récupérer le champ OP précédent pour chaque couple OF/OP.

Ce qui donnerait :

OF OP autres champs OP PRECEDENT
1 10 NULL
1 50 10
1 20 20
2 5 NULL
2 10 5
2 100 10
2 45 45
5 50 NULL
5 100 50
3 10 NULL

Par un curseur, je sais faire mais un post précédent m'a démontré
qu'en maitrisant le langage sql on pouvait faire beaucoup de choses
sans curseur et avec une meilleure efficacité.

A votre bon coeur!
Avatar
Fred BROUARD
SELECT OF, OP, (SELECT MAX(OP)
FROM tblTest
WHERE OP < T.OP
AND OF = T.OF)
FROM tblTest T

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


pat a écrit:
Bonjour,

J'ai une table

OF OP autres champs
1 10
1 50
1 20
2 5
2 10
2 100
2 45
5 50
5 100
3 10

La cle praire est OF / OP.

Je dois récupérer le champ OP précédent pour chaque couple OF/OP.

Ce qui donnerait :

OF OP autres champs OP PRECEDENT
1 10 NULL
1 50 10
1 20 20
2 5 NULL
2 10 5
2 100 10
2 45 45
5 50 NULL
5 100 50
3 10 NULL

Par un curseur, je sais faire mais un post précédent m'a démontré
qu'en maitrisant le langage sql on pouvait faire beaucoup de choses
sans curseur et avec une meilleure efficacité.

A votre bon coeur!



Avatar
pat
C'est exactement le résultat voulu mais je n'arrive toujours pas à me
sortir de l'update.
Il doit falloir utiliser la notion requête correlée mais je suis
complétement perdue dans la syntaxe.

update tbltest
set op_precedent=
SELECT OF, OP, (SELECT MAX(OP)
FROM tblTest
WHERE OP < T.OP
AND OF = T.OF) as op_precedent
FROM tblTest T

Au secours ! j'aimerais tellement comprendre une bonne fois pour toute
Avatar
Dominique
update tbltest
set op_precedent=(SELECT MAX(T.OP)
FROM tblTest as T
WHERE T.OP < tbltest.OP
AND T.OF = tbltest.OF)


pat a écrit :
C'est exactement le résultat voulu mais je n'arrive toujours pas à me
sortir de l'update.
Il doit falloir utiliser la notion requête correlée mais je suis
complétement perdue dans la syntaxe.

update tbltest
set op_precedent > SELECT OF, OP, (SELECT MAX(OP)
FROM tblTest
WHERE OP < T.OP
AND OF = T.OF) as op_precedent
FROM tblTest T

Au secours ! j'aimerais tellement comprendre une bonne fois pour toute



Avatar
Dominique
update tbltest
set op_precedent=(SELECT MAX(T.OP)
FROM tblTest as T
WHERE T.OP < tbltest.OP
AND T.OF = tbltest.OF)


pat a écrit :
C'est exactement le résultat voulu mais je n'arrive toujours pas à me
sortir de l'update.
Il doit falloir utiliser la notion requête correlée mais je suis
complétement perdue dans la syntaxe.

update tbltest
set op_precedent > SELECT OF, OP, (SELECT MAX(OP)
FROM tblTest
WHERE OP < T.OP
AND OF = T.OF) as op_precedent
FROM tblTest T

Au secours ! j'aimerais tellement comprendre une bonne fois pour toute