IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

résultat d'un update non attendu


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 47
    Points : 50
    Points
    50
    Par défaut résultat d'un update non attendu
    bonjour,

    voilà je désire faire un update d'une table pour un champ (ligne i) dont la valeur d'un champ correspond à la somme du même champ de la ligne précédente (ligne i-1) et d'un autre champ (ligne i).
    donc en gros SOLDE i = SOLDE i-1 + VALEUR_OPE i

    la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    update CALCUL_TEMP as ct0 
    set ct0.SOLDE = (
            ct0.VALEUR_OPE + 
            (select ct1.SOLDE 
             from CALCUL_TEMP as ct1 
             where ct1.ID_CALCUL_TEMP = (ct0.ID_CALCUL_TEMP - 1))) 
    where ct0.ID_CALCUL_TEMP > 1
    voilà les données en base avant update :
    ID_CALCUL_TEMP VALEUR_OPE SOLDE
    1 10.0 10.0
    2 10.0 0.0
    3 10.0 0.0
    4 100.0 0.0
    5 10.0 0.0
    6 20.0 0.0
    7 50.0 0.0

    les données après l'update :
    ID_CALCUL_TEMP VALEUR_OPE SOLDE
    1 10.0 10.0
    2 10.0 20.0
    3 10.0 20.0
    4 100.0 110.0
    5 10.0 110.0
    6 20.0 30.0
    7 50.0 70.0

    les valeurs attendues :
    ID_CALCUL_TEMP VALEUR_OPE SOLDE
    1 10.0 10.0
    2 10.0 20.0
    3 10.0 30.0
    4 100.0 130.0
    5 10.0 140.0
    6 20.0 160.0
    7 50.0 210.0

    visiblement elle fait la somme SOLDE i = VALEUR_OPE i-1 + VALEUR_OPE i
    la base est un HSQLDB 1.8 en mode fichier en environnement java 1.6

    Si quelqu'un a une idée de la raison

  2. #2
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 100
    Points
    3 100
    Par défaut
    Bonjour,

    Le résultat que tu obtiens est solde = valeur_op + solde ligne -1 (qui est égal à valeur_op + 0)
    Ce n'est pas ce que tu attends mais c'est bien celui que tu demandes.
    Tu ne raisonnes pas en terme d'ensemble.
    Il n'y aucune raison pour que la requête calcule d'abord la somme de la ligne id = 2, puis la ligne id = 3 etc...
    Au vu du résultat que tu attends tu souhaites une somme incrémentale.
    Je n'ai pas testé mais ça devrait te donner le résultat voulu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE 	Calcul_temp 
    SET 		solde = 
    (
    SELECT	SUM(CT1.valeur_ope) 
    FROM		Calcul_temp CT1
    WHERE		CT1.id_calcul_temp <= Calcul_temp.id_calcul_temp 
    GROUP BY 	Calcul_temp.id_calcul_temp 
    )
    WHERE		id_calcul_temp > 1
    ;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par TheLeadingEdge Voir le message
    Bonjour,

    Le résultat que tu obtiens est solde = valeur_op + solde ligne -1 (qui est égal à valeur_op + 0)
    Ce n'est pas ce que tu attends mais c'est bien celui que tu demandes.
    Tu ne raisonnes pas en terme d'ensemble.
    Il n'y aucune raison pour que la requête calcule d'abord la somme de la ligne id = 2, puis la ligne id = 3 etc...
    Au vu du résultat que tu attends tu souhaites une somme incrémentale.
    Je n'ai pas testé mais ça devrait te donner le résultat voulu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE 	Calcul_temp 
    SET 		solde = 
    (
    SELECT	SUM(CT1.valeur_ope) 
    FROM		Calcul_temp CT1
    WHERE		CT1.id_calcul_temp <= Calcul_temp.id_calcul_temp 
    GROUP BY 	Calcul_temp.id_calcul_temp 
    )
    WHERE		id_calcul_temp > 1
    ;
    effectivement ça marche. je comprend très bien mon erreur j'ai raisonné en terme procédural. merci j'ai appris une autre chose aujourd'hui

    Edit : le group by n'est pas nécéssaire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JAXB] Résultat non attendu
    Par SpeedOverflow dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 23/06/2011, 11h45
  2. sdelete et reaser : résultat non attendu
    Par DSGSLA dans le forum Sécurité
    Réponses: 4
    Dernier message: 16/03/2011, 12h17
  3. Résultat non attendu de l'opérateur Like
    Par idrysse31 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/03/2010, 13h01
  4. Update non fonctionnel
    Par kissmytoe dans le forum Access
    Réponses: 7
    Dernier message: 07/03/2006, 19h37
  5. Update non réussi à cause de la troncature de données
    Par m-mas dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/12/2005, 17h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo