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 :

Mise à jour d'une colonne: update avec case


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Août 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 65
    Points : 66
    Points
    66
    Par défaut Mise à jour d'une colonne: update avec case
    Bonjour à tous,

    c'est mes premiers pas sur ce forum. j'espère trouver solution à ma requete

    Je vous explique sur quoi je travaille. Je fais une mise à jour sur une colonne dans une table a partir d'une
    autre table, je rencotre des dificultés sur l'insertion . j'ai fini par faire cette requete, mais le problème est que
    juste la prmière valeur de la [TRANSCO_MW-01] est prise avec ma condition when les 001 me sont bien retourné.
    quelqu'un pourrait m'aider!!
    merci

    la requete est la suivante:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    update [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE]
     set [comptebancaire_codeDOM]=
             CASE
                 WHEN C.[comptebancaire_sousRole] in (select distinct T.CBsousrole from [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T,
                  [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C where T.CBcode=C.comptebancaire_code and T.CBsousrole=C.[comptebancaire_sousRole] )
                      and C.comptebancaire_code  in ( select distinct T.CBcode from [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T ,
                  [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C where T.CBcode=C.comptebancaire_code and T.CBsousrole=C.[comptebancaire_sousRole] )
                 THEN T.codeDomELODIE
                 ELSE '001'
     
                   END
    from [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C,
    [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T


    le resultat de la mis a jour est:
    comptebancaire_tiers    comptebancaire_code    comptebancaire_codeDOM    comptebancaire_nomBanque    comptebancaire_domiciliation    comptebancaire_paysCompte
    73300500    29006    1    VIVAS    SAF    FR
    73300500    29007    001    fsfsfsf    sfsfsfsfsf    FR
    73452000    29005    1    dgdgdgdgd    dgdgdgdgdg    FR
    73452000    29005    1    dgdgdgdgd    dgdgdgdgdg    FR
    73453100    29010    001    LA POSTE    CA UNION NORD-EST REIMS    FR
    73453100    29010    001    LA POSTE    CA UNION NORD-EST REIMS    FR
    73455200    29008    001    ghghdgdgdg    dgdgddgdgd    FR
    74054120    44369    001    LAVIE    VIVA    FR

    au lieux de

    comptebancaire_tiers    comptebancaire_code    comptebancaire_codeDOM    comptebancaire_nomBanque    comptebancaire_domiciliation    comptebancaire_paysCompte
    73300500    29006    1    VIVAS    SAF    FR
    73300500    29007    001    fsfsfsf    sfsfsfsfsf    FR
    73452000    29005    3    dgdgdgdgd    dgdgdgdgdg    FR
    73452000    29005    4    dgdgdgdgd    dgdgdgdgdg    FR
    73453100    29010    001    LA POSTE    CA UNION NORD-EST REIMS    FR
    73453100    29010    001    LA POSTE    CA UNION NORD-EST REIMS    FR
    73455200    29008    001    ghghdgdgdg    dgdgddgdgd    FR
    74054120    44369    001    LAVIE    VIVA    FR

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    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 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Je dois dire que je suis TRES étonné que votre requête fonctionne.

    En effet, dans votre THEN, vous référencez un alias d'une table utilisée dans un sous select présent dans le WHEN, donc :
    - un périmètre différent (je suis étonné que l'alias T soit disponible)
    - potentiellement, il peut y avoir plusieurs lignes dans T pour une même ligne de la table mise à jour, donc aucune idée de quel ligne choisir

    J'avoue que votre requête n'est pas très clair, et je n'arrive pas bien à comprendre ce qu'elle doit faire.

    Pouvez-vous expliquer avec des mots simples ce qu'il faut faire ?

    Le DDL des tables ainsi que quelques INSERT de données d'exemple (cf. charte du forum) seraient un plus pour répondre à la question avec précision.
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Ce n'est en effet pas très clair.

    Il n'y a aucune condition de jointure dans votre requete, et vous utilisez les même alias de table dans vos sous requêtes que dans la requete principale, ce qui n'aide pas du tout à la compréhension.

    Que donne ceci (sans aucune certitude avec les informations dont nous disposons):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    UPDATE C
       SET [comptebancaire_codeDOM]= COALESCE( T.codeDomELODIE,  '001')
    FROM [MW_CONCEPTION].[dbo].[WS_COMPTE_BANCAIRE] C
    LEFT OUTER JOIN [MW_CONCEPTION].[dbo].[TRANSCO_MW-01] T
        ON T.CBcode=C.comptebancaire_code 
        AND T.CBsousrole=C.[comptebancaire_sousRole]

  4. #4
    Membre du Club
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Août 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 65
    Points : 66
    Points
    66
    Par défaut Mise à jour de colonne
    le but de cette requete est de mettre a jour la colonne comptebancairecodeDOM de la table comptebancaire si l'association comptebancairecode et comptebancairesousrole est présent dans la table trancso (qui comprend les colonnes: comptebancairecode, comptebancairesousrole et codeDOM)
    -si elle est présente on prend la valeur du codeDom correspondant dans la table trancso
    sinon on met le codeDom de la table comptebancaire a 001 et on insert une ligne dans la table
    transco avec le codeDOM a 001 et l'association comptebancairecode et comptebancairesousrole qui ne sont pas présent dans
    la table transco.
    j'espère que avec ses explications ça peut aider a résoudre ma requete.
    Merci
    voici l'exemple des deux tables

    table transco

    codeDomELODIE CBcode CBsousrole
    1 29006 73300500|FOUR|FAPP|0960
    2 29007 73300500|FOUR|FAPP|0960
    3 29005 73452000|AGRI|TNA|0960
    4 29005 73452000|FOUR|FAPP|0960


    table comptebancaire

    comptebancaire_tiers comptebancaire_code comptebancaire_codeDOM comptebancaire_sousrole
    73300500 29006 NULL 73300500|FOUR|FAPP|0960
    73300500 29007 NULL 73300500|FOUR|FGEN|72
    73452000 29005 NULL 73452000|AGRI|TNA|0960
    73452000 29005 NULL 73452000|FOUR|FAPP|0960
    73453100 29010 NULL NULL
    73453100 29010 NULL 73453100|FOUR|FAPP|0960
    73455200 29008 NULL NULL




    si dans la table transco j'ai plusieurs fois le même sousrole avec des codeDOM différent je dois prendre le plus grand codeDOM de ce sousrole.
    cette règle aussi doit etre géré dans le update de la colonne comptebancaire_codeDOMavec la solution que vous venez de m'apporter je ne sais pas comment
    ajouter cette nouvelle condition sans utilisé un case. Je ne suis toujours pas arrivé à la fin de mes ennuis

  5. #5
    Membre du Club
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Août 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 65
    Points : 66
    Points
    66
    Par défaut
    Super
    avec cette solution la mise a jour a marché. merci

  6. #6
    Membre du Club
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Août 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 65
    Points : 66
    Points
    66
    Par défaut Mise à jour de colonne
    bonjour,

    En effet la solution que vous m'avez apporté marche mais si je veux ajouter une autre condition pour: dans le cas ou
    j'aurai un comptebancairesousrole de la table comptebancre 1 ou 2 fois dans la table transco alors de prendre
    son plus grand codeDOM +1 et de le mettre a jour dans la colonne codedom du ccomptebancaire comme la solution que vous m'avez donné

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 604
    Points
    4 604
    Par défaut
    Bonsoir

    Je me permets de rebondir sur votre poste qui inopinément correspond exactement à ce que j'allais demander.

    Voici un bout de code test que j'ai en stock :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     UPDATE nomtable
    SET colonneA = CASE colonneA
    WHEN colonneA = '' THEN colonneB = ''
    ...
    END ;

    Ici c'était pour écraser des types clients dans la colonne B suivant l'ancien type dans la colonne A.

    D'un point de vu logique mon code est correct ?

  8. #8
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    Ouh la !

    Il y a plusieurs erreurs : Le Set et le case mal écrit et il manque un from pour récupérer les valeurs de la colonne A
    SI tu Souhaite modifier les valeurs du champs ' Colonne B' c'est plus tôt
    Code "sql" : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Update NomtableDestination
    Set Colonne B = 
            Case Colonne A 
                 WHEN  'Chaine1' then 'ChaineReplancement1' 
                 WHEN  'Chaine2' then 'ChaineReplancement2'
                 ELSE 'ChaineReplancement3' 
            end
    From  NomTableSource
    Where .....

    Je te conseil Vivement d'aller lire le blog de SQLPro ...
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

  9. #9
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 604
    Points
    4 604
    Par défaut
    Merci de votre retour je teste le code

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    La syntaxe générale des UPDATE avec sous requêtes dans MS SQL Server est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE aliasCible
    SET    ...
    FROM   TABLE_CIBLE AS aliasCible
           [INNER JOIN ...]
           [ ??? OUTER JOIN ...]
    [WHERE  ... ]
    [GROUP  BY ... ]
    [HAVING ... ]
    Pour mettre au point une telle requête il suffit de faire la requête SELECT équivalente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    --> plus de UPDATE
    SELECT    ... --> au lieu de SET
    FROM   TABLE_CIBLE AS aliasCible
           [INNER JOIN ...]
           [ ??? OUTER JOIN ...]
    [WHERE  ... ]
    [GROUP  BY ... ]
    [HAVING ... ]
    Et au final, rajouter le UPDATE aliasCible et transformer le SELECT en SET !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/06/2015, 03h28
  2. Réponses: 3
    Dernier message: 25/11/2010, 12h59
  3. Réponses: 7
    Dernier message: 20/08/2009, 02h48
  4. [O10g] Requête de mise à jour d'une colonne
    Par davasm dans le forum SQL
    Réponses: 2
    Dernier message: 07/04/2009, 10h02
  5. [MySQL] Mise à jour d'une colonne.
    Par kifouillou dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 31/03/2008, 12h15

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