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 :

Suppression enregistrement en fonction de champs de la table


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Février 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef d'entreprise

    Informations forums :
    Inscription : Février 2016
    Messages : 23
    Points : 20
    Points
    20
    Par défaut Suppression enregistrement en fonction de champs de la table
    Bonjour à tous,

    Je suis un problème de suppression de champ en fonction de critère de la même table. Voici les éléments de la table et le contexte :

    Table (nom des colonnes en première ligne puis un exemple de données):

    Code article / Code Fournisseur / Libelle / Date d'application / Prix / Index
    12345 1234 test1 20190315 14.50 145263 (données de J-3)
    12345 1234 test1 20190401 12.50 200123 (données de J)
    23456 2345 adrm 20190311 35.50 200124 (données de J)

    Contexte :
    Je reçois tous les jours des mises à jour sur des articles envoyés par mon fournisseur. dans mon fichier, il me donne un élément important qui est la date d'application des modifications. Ce fournisseur peut me les transmettre à l'avance afin de les intégrer au bon moment.
    Le problème c'est qu'il peut m'envoyer plus tard des informations modificatives et je dois intégrer et garder au cas pour intégration future que la dernière information données.

    Pour reprendre mon exemple, aujourd'hui, je dois garder dans ma table que les informations concernant l'article 12345 avec l'index 200123 et je devrais les intégrer dans mon fichier de mise à jour le 01/04/2019.

    Ma question est la suivante : comment, après avoir intégrer mes données dans ma table, je peux supprimer l'enregistrement avec l'index 145263 sachant que je dois être sur que je compare le bon article du bon fournisseur?

    D'avance, merci pour votre aide.

    Julien

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 126
    Points : 38 509
    Points
    38 509
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Je reformule pour être sur d'avoir bien compris :
    Si pour un même article et un même fournisseur, il existe plusieurs lignes avec des dates d'application différentes, je ne dois conserver que la ligne dont la date d'application est la plus récente

    EDIT : pour récupérer les enregistrements à conserver (les plus récents donc)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       select * from 
            (select fou
                  , art
                  , dte
                  , rank() over(partition by fou, art  order by dte desc) as Rg
             from ma_table
            ) as T1
       where t1.Rg=1

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Février 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef d'entreprise

    Informations forums :
    Inscription : Février 2016
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    Bonsoir Escartefigue,

    Je suis désolé mais je ne comprends pas le message que j'ai reçu sur ma boite mail et celui sur le forum. Pourriez vous me renvoyer la requete s'il vous plait? voici ce que j'ai reçu par mail

    Bonjour,

    Je reformule pour être sur d'avoir bien compris :
    Si pour un même article et un même fournisseur, il existe plusieurs lignes avec des dates d'application différentes, je ne dois conserver que les lignes dont la date d'application est valide ou à venir.

    Si c'est bien ça, ceci devrait convenir :
    <div class="bbcode_container">
    <table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
    <td style="border: 0; padding: 0; text-align: left">Code :</td>
    <td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
    <a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
    <pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"> <span style="color: #0000ff;">delete</span>
    <span style="color: #0000ff;">from</span> ma_table T0
    <span style="color: #0000ff;">where</span> <span style="color: #0000ff;">exists</span>
    <span class="br0">(</span><span style="color: #0000ff;">select</span> <span style="color: #cc66cc;">1</span>
    <span style="color: #0000ff;">from</span> ma_table T1
    <span style="color: #0000ff;">where</span> T1.article = T0.article
    <span style="color: #0000ff;">and</span> T1.fournis = T0.fournis
    <span style="color: #0000ff;">and</span> T1.dateap =<current_date
    <span style="color: #0000ff;">and</span> T1.dateap < T0.dateap<span class="br0">)</span></pre></td></tr></table></pre>
    </div>S'il ne faut conserver que la dernière ligne même si celle-ci ne sera applicable que dans le futur, alors supprimez le filtre sur la current_date dans la requête correlée
    ***************

    D'avance, merci.

    Julien

  4. #4
    Membre à l'essai
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Février 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef d'entreprise

    Informations forums :
    Inscription : Février 2016
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    Bonsoir à tous,

    je complète mes propos : Si pour un même article et un même fournisseur, il existe plusieurs lignes avec des dates d'application différentes, je ne dois conserver que la ligne qui a été insérer en dernier.

    D'avance, merci

    Julien

  5. #5
    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,

    Quelle colonne permet de connaitre l'ordre d'insertion ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Février 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef d'entreprise

    Informations forums :
    Inscription : Février 2016
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    Bonjour,
    C’est la colonne index qui permet de connaitre l'ordre d'insertion dans la table. L'enregistrement qui aura le numéro le plus grand sera le dernier enregistrement inscrit dans la table.
    D’avance merci.
    Julien

  7. #7
    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,

    vous pouvez partir la dessus (pas testé, à adapter)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    WITH CTE AS (
        SELECT ROW_NUMBER() OVER(PARTITION BY CodeArticle, CodeFournisseur  ORDER BY index DESC) AS RN
        FROM LaTable
    )
    DELETE 
    FROM CTE
    WHERE RN > 1
    ;

  8. #8
    Membre à l'essai
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Février 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef d'entreprise

    Informations forums :
    Inscription : Février 2016
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    Le principe m'a l'air bon. je fais plusieurs teste et je vous tiens au courant.

    d'avance, merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/01/2015, 06h55
  2. Réponses: 8
    Dernier message: 01/12/2014, 13h18
  3. [AC-2010] Comptage des enregistrements en fonction des valeurs des champs
    Par redojackson dans le forum VBA Access
    Réponses: 11
    Dernier message: 01/10/2013, 01h05
  4. Réponses: 31
    Dernier message: 19/04/2010, 20h37
  5. Réponses: 5
    Dernier message: 31/08/2007, 15h23

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