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 :

Mettre à jour les champs d'une table avec d'autres valeurs du même champ de cette table (autojointure ?)


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Mettre à jour les champs d'une table avec d'autres valeurs du même champ de cette table (autojointure ?)
    Besoin d'une requete pour mettre à jour champs d'une table avec valeur du meme champ de cette table d'autres enregistrements (apparier enreg. avec auto-jointure ?)

    Contexte :
    J'ai une table d'écritures comptable ( ""mcd"" vieux et non conforme , sans clés primaire, etrangere avec des "pseudo clé géré via le code)
    Sgbd : SQLServer 2012 (pour mon environnement de test)

    Objectif/problematique :
    Mettre à jour le champ séquence de chaque enregistrement d'une liste donnée et identifiée à partir de la valeur du meme champs séquence d'un enregistrement correspondant de la meme table.
    En gros j'ai des ecriture de tva qui ont un mauvais numero de sequence et que je desire remplacer par le bon numero de séquence a savoir celui d'une ecriture de compte fournisseur correspondant

    L'idée est donc d'apparier 2 enregistrements pour recuperer le numero de sequence adequat et mettre à jour les ecriture de tva (compte commencant par 44566 , ces écritures sont celles qui sont clairement identifiés avec la valeur TVAD dans le champs

    Je vous donne un exemple de ce cas de figure .
    On a donc une liste d'ecriture de tva qui ont un mauvais numéro de sequence.
    (Je n'ai pas reproduit ici tous les champs de la table mais ceux qui me permettent d'identifier et "lier", "apparier" les enregistrements)
    J'ai mis les nom de champs de la table pour comprendre les ordres SQL et aussi au dessus un nom plus litteral plus descriptif
    Table HISCOM avec exemple d'ecritures de tva :

    Nom : tva.png
Affichages : 264
Taille : 15,6 Ko



    Pour chacun de ces enregistrement on peut retrouver un enregistrement correspondant sur un compte fournisseur avec des valeurs identiques pour les champs CodeCompagnie , Numero de piece , date de mouvement, Code journal
    De plus on est sûr que cet enregistrement correspondant a comme type de compte 06 Ou qu'il commence par 401 (cela revient au même)

    Meme table HISCOM avec exemples d'ecriture fournisseur

    Nom : EcriFournisseur.png
Affichages : 348
Taille : 14,1 Ko

    L'objectif est donc de venir remplacer la sequence 07003475 de l'ecriture de tva de la piece 305080 par la sequence 11115856 de l'ecriture fournisseur 401TOTO pour la meme piece 305080 et ce pour toutes les ecritures de tva (qu'on peut retrouver facilement par la valeur TVAD du champs CodeGroupe).



    Tests/Essai
    Dans un premier temps reussir a faire un select adequat pour afficher cote a cote les ecritures de tva et a droite la sequence issue de la recherche afin de verifier l'exactitude de la requete par sondage

    En qqs sorte je voudrais afficher une table resultat de ce type (avec l'alias de table HFOU)

    Nom : Tablejointeresultat.png
Affichages : 343
Taille : 17,0 Ko



    Je suis parti sur des auto jointures mais cela me ramene trop d'enregistrement car mes where porte surement la table virtuelle issus de la jointure et non la clause on elle-même (cf https://conseilit.wordpress.com/2010...dans-le-where/ )
    Je suis donc passé de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT HTVA.HIKTSOC,HTVA.HIKTCPT,HTVA.HIKJDMVT,HTVA.HICTCJ,HTVA.HICTPIE,HTVA.HICTTYP,HTVA.HICTSEQ,HTVA.HICTGROUPE, HFOUR.*
    FROM HISCOM HTVA
    LEFT OUTER JOIN HISCOM HFOUR
    ON (HTVA.HIKTSOC=HFOUR.HIKTSOC AND HTVA.HICTPIE=HFOUR.HICTPIE AND HTVA.HIKJDMVT=HFOUR.HIKJDMVT AND HTVA.HICTCJ=HFOUR.HICTCJ)
    WHERE  HTVA.HICTGROUPE='TVAD' AND HFOUR.HICTTYP='09'
    à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT HTVA.HIKTSOC,HTVA.HIKTCPT,HTVA.HIKJDMVT,HTVA.HICTCJ,HTVA.HICTPIE,HTVA.HICTTYP,HTVA.HICTSEQ,HTVA.HICTGROUPE, HFOUR.*
    FROM HISCOM HTVA
    LEFT OUTER JOIN HISCOM HFOUR
    ON (HTVA.HIKTSOC=HFOUR.HIKTSOC AND HTVA.HICTPIE=HFOUR.HICTPIE AND HTVA.HIKJDMVT=HFOUR.HIKJDMVT AND HTVA.HICTCJ=HFOUR.HICTCJ)
    AND  HTVA.HICTGROUPE='TVAD' AND HFOUR.HICTTYP='09'
    --AND HFOUR.HICTCJ='60'  AND HTVA.HICTTYP='06'

    Je me demande si l'auto jointure est déjà une bonne solution de départ ?
    J'ai du mal deja a apparier les enregistrement dans une vue de type select et je pense que j'aurais encore plus de mal a passer au update ensuite.

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    J'ai pas repris toutes les colonnes, mais en gros, ça donne le bon résultat chez moi avec ton jeu de données :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    /*
    create table hiscom
    (
    	hiktcpt varchar(10),
    	hicttyp char(2),
    	hictpie char(6),
    	hicnmt decimal(8,2),
    	hictseq char(8),
    	hictgroup varchar(4)
    );
    go
     
    insert into hiscom (hiktcpt, hicttyp, hictpie, hicnmt, hictseq, hictgroup)
    values ('4456610000', '09', '305043', 79.15, '07003475', 'TVAD'),
           ('4456610000', '09', '305080', 198.72, '07003475', 'TVAD'),
    	   ('4456610000', '09', '305128', 10, '07003475', 'TVAD'),
    	   ('401TOTO', '06', '305080', 226.0, '11115856', null),
    	   ('401TITI', '06', '305856', 2000, '11115856', null),
    	   ('6024000000', '11', '305080', 189.28, '10245489', null);
    */
     
    select * from hiscom;
     
    with correct (hiktcpt, hicttyp, hictpie, hicnmt, hictseq, hictgroup, hictseq_correct)
    as
    (
    select tva.hiktcpt, tva.hicttyp, tva.hictpie, tva.hicnmt, tva.hictseq, tva.hictgroup, fou.hictseq
    from hiscom tva
    left outer join hiscom fou on fou.hiktcpt like '401%' and fou.hicttyp = '06' and fou.hictgroup is null and fou.hictpie = tva.hictpie
    where tva.hiktcpt not like '401%' and tva.hicttyp <> '06' and tva.hictgroup = 'TVAD'
    )
    update his
    set his.hictseq = cor.hictseq_correct
    from hiscom his
    inner join correct cor on cor.hiktcpt = his.hiktcpt and cor.hicttyp = his.hicttyp and cor.hictpie = his.hictpie and cor.hictseq = his.hictseq and cor.hictgroup = his.hictgroup and cor.hictseq_correct is not null;
     
    select * from hiscom;
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. Mettre à jour les propriété d'une List<struct>[i] ?
    Par StringBuilder dans le forum C#
    Réponses: 3
    Dernier message: 21/01/2014, 18h34
  2. Réponses: 7
    Dernier message: 24/09/2012, 23h12
  3. [PPT-2010] mettre à jour les nombres dans une phrase
    Par pepsister dans le forum Powerpoint
    Réponses: 1
    Dernier message: 14/06/2010, 10h32
  4. Requête avec plusieurs paramètres d'un même champ d'une table
    Par jb.julien dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/08/2007, 09h43
  5. Mettre à jour les lignes d'une colonne dans dataTable
    Par Mikelester12 dans le forum VB.NET
    Réponses: 2
    Dernier message: 19/07/2007, 08h31

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