Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours 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 15/08/2011, 12h47   #1
Invité de passage
 
Homme
Inscription : août 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 3
Points : 0
Points : 0
Par défaut UPDATE SQL récupérer enregistrement précédent

Bonjour,

J'aurais besoin d'aide. En Access 2003, j'ai une table dont la structure est comme suit (j'ai mis des valeurs en exemple) :

ID--------Date ---------Valeur---------ValeurPrecedent
1-------01/01/2011-------- toto
2-------01/01/2011-------- titi
3-------01/01/2011--------lulu
1-------02/01/2011--------manu
2-------02/01/2011--------lili
3-------02/01/2011------- adele
1-------03/01/2011--------lolo
2-------03/01/2011-------nono
3-------03/01/2011--------lala

Avec valeurPrecedent à NULL

Comment faire (avec instruction SQL UPDATE si possible) pour mettre à jour le champ ValeurPrecedent à partir de la date 02/01/2011 pour que ce champ prenne la valeur du champ "Valeur" à la date précédente et pour le même ID ?

C'est à dire :

ID--------Date ---------Valeur---------ValeurPrecedent
1-------01/01/2011-------- toto
2-------01/01/2011-------- titi
3-------01/01/2011--------lulu
1-------02/01/2011--------manu-----------toto
2-------02/01/2011--------lili---------------titi
3-------02/01/2011------- adele------------lulu
1-------03/01/2011--------lolo--------------manu
2-------03/01/2011-------nono-------------lili
3-------03/01/2011--------lala--------------adele



Je vous remercie
ragemind est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2011, 15h51   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
Voici la requête que tu pourrais exécuter lorsque tu insères une nouvelle valeur dont l'ID existe déjà
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
INSERT  INTO  matable
    (   id
    ,   date
    ,   valeur
    ,   valeurprecedent
    )
SELECT  src.id
    ,   :nouvelledate
    ,   :nouvellevaleur
    ,   src.valeur
FROM    matable AS  src
WHERE   src.id  = :idmodifié
    AND EXISTS
        (   SELECT  1
            FROM    matable AS anc
            WHERE   src.id  = anc.id
            HAVING  src.date = MAX(anc.date)
        )
;
Je te laisse réfléchir à la manière de faire quand l'ID n'existe pas et à la requête pour l'UPDATE
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2011, 17h45   #3
Invité de passage
 
Homme
Inscription : août 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 3
Points : 0
Points : 0
Bonjour al1_24,

Merci de ta réponse mais au fait, j'aurais du donner un exemple plus réaliste. En pratique, le champ valeur ne contient pas du texte mais des chiffres (des cours de bourses). Donc une ligne doit ressembler à cela

ID-------------------Date-------------Valeur----ValeurPrecedent-------
NomEntreprise-------02/01/2011--------40

Et les valeurs sont insérées une bonne fois pour toute dans la table (donc j'aurai ni de nouvelles date à ajouter ni de nouvelles valeurs car les données sont déjà présentes dant la table.

Je ne sais pas si ton code peut être adapter à mon cas (j'ai réfléchi et je ne trouve pas de solution )

As-tu une idée ?

Merci beaucoup !
ragemind est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 09h19   #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
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
UPDATE matable
SET valeurPrecedente=(SELECT valeur
                                FROM matable ANT
                                WHERE ANT.ID=matable.ID
                                   AND matable.[Date]=(SELECT MAX([DATE])
                                                                 FROM matable ANTMAX
                                                                 WHERE ANTMAX.ID=matable.id 
                                                                    AND ANTMAX.[date]<matable.[date])
WHERE [date]>='02/01/2011'
   AND EXISTS(SELECT * 
                     FROM matable A
                     WHERE A.ID=matable.ID AND [date]<'02/01/2011')
__________________
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 16/08/2011, 21h39   #5
Invité de passage
 
Homme
Inscription : août 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 3
Points : 0
Points : 0
Merci beaucoup iberserk pour la réponse mais j'ai essayé et j'ai l'erreur en image jointe. J'ai tout essayé mais je n'arrive pas à voir où est le problème.

J'ai mis aussi en pièce jointe l'image de ma table.

Voici le code (VBA Access) que j'ai écrit :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 sSQL = "UPDATE matable " & _
            "SET ValeurPrec=(SELECT Valeur " & _
                                "FROM matable ANT " & _
                                "WHERE ANT.ID = matable.ID " & _
                                   "AND matable.LaDate=(SELECT MAX(LaDate) " & _
                                                                 "FROM matable ANTMAX " & _
                                                                 "WHERE ANTMAX.ID = matable.ID " & _
                                                                    "AND ANTMAX.LaDate < matable.LaDate) " & _
            "WHERE LaDate >= 2 " & _
            "AND EXISTS(SELECT * " & _
                     "FROM matable A " & _
                     "WHERE A.ID=matable.ID AND LaDate < 2));"
 
    DoCmd.RunSQL sSQL
En espérant votre aide et merci beaucoup !
Images attachées
Type de fichier : png table.PNG (9,7 Ko, 2 affichages)
Type de fichier : png erreur.PNG (19,8 Ko, 6 affichages)
ragemind est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 08h39   #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
Essayez ça: (parenthèse fermante mal placée)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
sSQL = "UPDATE matable " & _
            "SET ValeurPrec=(SELECT Valeur " & _
                                "FROM matable ANT " & _
                                "WHERE ANT.ID = matable.ID " & _
                                   "AND matable.LaDate=(SELECT MAX(LaDate) " & _
                                                                 "FROM matable ANTMAX " & _
                                                                 "WHERE ANTMAX.ID = matable.ID " & _
                                                                    "AND ANTMAX.LaDate < matable.LaDate)) " & _
            "WHERE LaDate >= 2 " & _
            "AND EXISTS(SELECT * " & _
                     "FROM matable A " & _
                     "WHERE A.ID=matable.ID AND LaDate < 2);"
 
    DoCmd.RunSQL sSQL
__________________
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 17/08/2011, 13h21   #7
Membre régulier
 
Inscription : décembre 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 64
Points : 87
Points : 87
Bonjour,

pour ma part je peux te proposer cette requête qui marche (testée en vrai)
mais avec Mysql (je n'ai pas Access 2003)
Je pense que tu peux t'en inspirer en remplaçant la fonction timediff par son équivalent, et peut-être en changeant la manière dont est faite la jointure (par exemple avec un from au lieu du update table1 t, table1, f
le seul hic serait que l'update de Access ne puisse référencer plusieurs tables.

Code :
1
2
3
4
5
UPDATE tableautoupdate t, tableautoupdate f
SET t.valeurprecedente = f.valeur
WHERE
  t.ID = f.ID
  AND DATEDIFF(t.datecol,f.datecol) = 1;
Cordialement
semaphore1984 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 09h05.


 
 
 
 
Partenaires

Hébergement Web