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 :

Vider la valeur d'une colonne de tous les enregistrements excepté le premier


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut Vider la valeur d'une colonne de tous les enregistrements excepté le premier
    Bonjour,

    Je voudrais par exemple dans l'affichage ci-dessous supprimer tous les 'X' de la colonne 5 et garder le premier 'X' s'il y a plusieurs enregistrements qui ont la même valeur dans la colonne 2

    col1 col2 col3 col4 col5
    carré 1 c1 d1 x
    carré 1055 c1 d1 x
    carré 1055 e1 f1 x

    Résultat attendu

    col1 col2 col3 col4 col5
    carré 1 c1 d1 x
    carré 1055 c1 d1 x
    carré 1055 e1 f1

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il faut déterminer un critère de tri pour définir le premier. Supposons que ce soit col3.
    Testez ces requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    update t1
       set t1.col5 = null
      from MaTable as t1
      join MaTable as t2  on t2.col2 = t1.col2
                         and t2.col3 < t1.col3
     where t1.col5 = 'x';
     
    update MaTable
       set col5 = null
     where col5 = 'x'
       and exists (select null
                     from MaTable as t2
                    where t2.col2 = MaTable.col2
                      and t2.col3 < MaTable.col3)

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut
    Merci beaucoup pour votre aide et votre réactivité.

    J'ai essayé la première requête et cela a fonctionné pour une seule procédure stockée mais pas pour une autre.

    Je vous explique mon problème.

    Je travaille sur un programme vb6 qui communique avec une base de données SQL Server.
    Le programme VB6 fait appel à ces procédures stockées pour extraire des données dans un fichier excel.

    Les 2 procédures stockées ont une structure presque similaire. Elles contiennent toutes les 2 des tables temporaires, des update, des select... et à la fin de la procédure il y a un dernier select qui fait des jointures entre des tables temporaires et des tables fixes.
    Pour pouvoir faire mon update à partir du code que vous me proposez, j'ai ajouté #tmp avant le from du dernier select afin de faire le update sur la table temporaire et récupérer le résultat final dans une vue comme ceci ;with cte as(....
    Le seul fait d'ajouter la table temporaire #tmp avant le from du dernier select fait planter le programme vb6 lors de l'appel de la deuxième procédure stockée.

    Messages d'erreur :
    1. Cannot change the ActiveConnection property of a Recordset object
    2. Operation is not allowed when the object is closed


    Code VB6
    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
    Call gobjApplication.OpenSqlConnection
    Set cmd = New ADODB.Command
    Set rst = New ADODB.Recordset
     
    with cmd
        .ActiveConnection = gobjDBConnection
        .CommandText = "maProcédureStockée"
        .CommandTye = adCmdStoredProc
        .CommandTimeout = 120
        .Parameters("@param1") = value1
        .Parameters("@param1") = value1
        .Parameters("@param1") = value1
        ...
        set rst = .Execute
    end with
     
    set rst.ActiveConnection = Nothing
     
    ...
    pour rappel: le seul fait de mettre #tmp dans le dernier select de ma procédure stockée génère l'erreur "Operation is not allowed when the object is closed" dans "rst = .Execute"

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut
    Est ce qu’il est possible de faire un case when au lieu du update?

    Merci

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut
    Je pensais à un truc comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select col1, col2, col3, col4, col5,
    case when row_number() over (partition by col3 order by col3, col4) = 1 then 'X' end as col6,
    col7,
    from maTable
    En mettant un count et une condition where le nombre de X est > 1 en faisant (having count > 1)

    Et un union all sur la deuxième colonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select col1, col2, col3, col4, col5, col6,
    case when row_number() over (partition by col3 order by col3, col4) = 1 then 'X' end as col7,
    from maTable

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/07/2021, 18h44
  2. Réponses: 5
    Dernier message: 29/01/2021, 11h52
  3. Réponses: 5
    Dernier message: 30/04/2017, 19h30
  4. Réponses: 2
    Dernier message: 24/07/2013, 09h58
  5. Réponses: 4
    Dernier message: 18/08/2008, 15h11

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