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

Développement SQL Server Discussion :

Update de colonne avec des vides


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 148
    Par défaut Update de colonne avec des vides
    Bonjour,
    Je voudrais mettre a jours une base avec update , mon probleme est de faire la chose suivante :
    1er colonne => num Carte
    2ieme colonne => Conducteur
    Cette deuxieme colonne est parfois vide je voudrais la remplir avec update mais comment ? si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update matable
    set Conducteur = conducteur 
    where num Carte = '0001' and Conducteur = ' '
    Comment puis je garder en memoire le nom du conducteur dans les lignes au dessus (exemple tableau)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Num carte    |   Conducteur
      0001         |       M.X
      0001         |    
      0001         |       M.X
    Merci pour vos conseils

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Si je comprends bien, dans ta table tu peux avoir plusieurs lignes ayant le même numéro de carte et le même nom du conducteur, ton problème c’est que le nom du conducteur n’est pas toujours renseigné.

    Si, c’est ça, la requête ci-dessous résout le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE A 
    SET A.Conducteur = (SELECT TOP (1) B.Conducteur -- le premier conducteur renseigné ayant le même numérode carte 
                        FROM MaTable B 
                        WHERE B.NumCarte = A.NumCarte 
                        AND  B.Conducteur <> ''  
                      )   
    FROM MaTable A      
    WHERE ISNULL(A.Conducteur,'') = '' -- on modifie uniquement les lignes où le nom du conducteur n'est pas renseigné 
    AND A.NumCarte = '0001 '

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 148
    Par défaut
    Bonjour Hmira,
    c'est exactement ça , je vais tester ta solution.
    merci pour ton aide

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 148
    Par défaut
    MERCI
    C'est parfait j'ai le resultat que je voulais , existe t'il une option pour garder en memoire la premiere cellule renseignée , et non pas la premiere de la liste ?
    MERCI ENCORE

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Oui, pour cela il faut utiliser la clause OUTPUT. Il faut :
    1 - Créer une variable de type Table (nommée par exemple @MesLignesAffectees (sous entendu lignes affectées par l’Update). La variable @MesLignesAffectes peut par exemple contenir 3 champs et avoir la structure suivante :
    NumCarte varchar(10)
    OldConduteur varchar(100) (pour toi OldConducteur ne sert à rien, tu le connais déjà. Il correspond à la valeur avant modification, Il est vide, cf clause WHERE de la requête du précédent post, mais bon, c’est juste pour la forme).
    NewConducteur varchar(100) valeur après modification
    2 – Rediriger les lignes affectées par l’update vers cette variable de type Table
    3 – Une fois les lignes affectées récupérées dans la variable de type Table @MesLignesAffectees, tu peux utiliser la table "mémoire" @MeslignesAffectees dans tout traitement que jugeras utiles !

    En T-SQL, cela ressemblera à ceci

    Code : 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
     
    DECLARE @MesLignesAffectees TABLE ( NumCarte varchar(10),  
                                        OldConducteur varchar(100), 
                                        NewConducteur varchar(100)
                                       )
     
    UPDATE A 
    SET A.Conducteur = (SELECT TOP (1) B.Conducteur -- le premier conducteur renseigné ayant le même numérode carte 
                        FROM MaTable B 
                        WHERE B.NumCarte = A.NumCarte 
                        AND  B.Conducteur <> ''  
                      )  
    OUTPUT INSERTED.NumCarte,
           DELETED.Conducteur AS OldCopnducteur,
           INSERTED.Conducteur AS NewConducteur
    INTO @MesLignesAffectees 
    FROM MaTable A      
    WHERE ISNULL(A.Conducteur,'') = '' -- on modifie uniquement les lignes où le nom du conducteur n'est pas renseigné 
    AND A.NumCarte = '0001 '
     
    -- Rajoutes tes traitements  ici  en utilisaant la variable de type TABLE @MeslignesAffectees 
    -- ........ 
    -- Exemple : 
    SELECT * FROM @MesLignesAffectees
    résultat du select ci-dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NumCarte	OldConducteur	NewConducteur
    0001 				M.X

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 148
    Par défaut
    Bonjour hmira,

    Merci pour la deuxieme solution , effectivement je n'y avais pas pensé , d'utiliser les tables virtuelles.

    MERCI bon week end

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

Discussions similaires

  1. Trii du colonnes avec des champs vide
    Par titeZ dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/08/2007, 11h11
  2. Correspondance ligne\Colonne avec des 'X'
    Par julie75 dans le forum Excel
    Réponses: 15
    Dernier message: 07/06/2007, 18h06
  3. Trier une colonne avec des valeurs numériques ou textes
    Par jfc dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/02/2006, 11h15
  4. update du colonne avec entier incrementé
    Par superfly dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/05/2004, 17h26

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