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

SAS Base Discussion :

Suppression de lignes avec compteur


Sujet :

SAS Base

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 35
    Par défaut Suppression de lignes avec compteur
    Bonjour,

    j'aimerais traduire en SAS l'instruction suivante:
    "s'il y a plusieurs lignes ayant des valeurs identiques pour les variables numero_contrat et annee, alors supprimer celles qui ont une valeur de montant égale à 0 (ou, de manière équivalente, conserver uniquement celles qui ont une valeur de montant non nulle)"

    un petit exemple:
    numero_contrat annee montant autres variables
    123123 2010 100 ***
    123123 2010 0 ***
    123123 2011 300 ***
    999999 2008 300 ***
    deviendrait

    numero_contrat annee montant autres variables
    123123 2010 100 ***
    123123 2011 300 ***
    999999 2008 300 ***


    Je ne vois pas trop qu'est-ce qu'il faut utiliser, et dans quel ordre: proc sort nodupkeys sur certaines variables, ou un proc sql avecun delete dedans..
    ce qui me pose vraiment problème, c'est qu'il faut que je compte le nombre de ligne pour chaque identifiant et ligne...

  2. #2
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 35
    Par défaut
    j'ai peut être une solution, mais elle est assez moche:

    en fait j'ai encore une autre variable DATE qui est une date précise (et la variable ANNEE n'est autre que l'année de cette date précise), sachant que si MONTANT=0, la date est du 31/12/annee (et sachant aussi que j'ai au maximum une ligne/contrat,annee où MONTANT peut être égal à 0)

    Donc
    1) je trie ma table par NUMERO_CONTRAT, DATE
    2) je fais la somme cumulée SCUMUL par NUMERO_CONTRAT et ANNEE de MONTANT (donc pour chaque contrat et chaque année, j'additionne au fur et à mesure les montants
    3) enfin, je dis que "si MONTANT=0 et SCUMUL <>0 alors delete"

    J'ai pas encore testé ma solution, mais même si elle fonctionne, elle est un peu tirée par les cheveux, donc j'aimerais bien avoir d'autres avis! ^^

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 35
    Par défaut
    j'ai peut être une solution, mais elle est assez moche:

    en fait j'ai encore une autre variable DATE qui est une date précise (et la variable ANNEE n'est autre que l'année de cette date précise), sachant que si MONTANT=0, la date est du 31/12/annee (et sachant aussi que j'ai au maximum une ligne/contrat,annee où MONTANT peut être égal à 0)

    Donc
    1) je trie ma table par NUMERO_CONTRAT, DATE
    2) je fais la somme cumulée SCUMUL par NUMERO_CONTRAT et ANNEE de MONTANT (donc pour chaque contrat et chaque année, j'additionne au fur et à mesure les montants
    3) enfin, je dis que "si MONTANT=0 et SCUMUL <>0 alors delete"

    J'ai pas encore testé ma solution, mais même si elle fonctionne, elle est un peu tirée par les cheveux, donc j'aimerais bien avoir d'autres avis! ^^
    je n'arrive pas à faire cette somme cumulée....je n'arrive pas à la réinitialiser à chaque fois que je change d'année au sein d'un même contrat

    pour l'instant, mon code est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DATA essai;set base;
    by numero_contrat annee date; 
    if first.numero_contrat and first.annee then cumul=montant;
    else if first.date then cumul+montant;
    run;
    et là, il réinitialise bien la somme à chaque passage à un nouveau contrat, mais il ne la réinitialise pas à chaque passage à une nouvelle annee, au sein d'un même contrat!

    HELP!

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Par défaut
    Bonjour,

    Tu peux faire :

    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
     
    data test;
       numero_contrat= 123123; 	annee= 2010; 	montant= 100; 	output;
       numero_contrat= 123123; 	annee= 2010; 	montant= 0; 	output;
       numero_contrat= 123123; 	annee= 2011; 	montant= 300; 	output;
       numero_contrat= 9999; 	annee= 2008; 	montant= 300; 	output;
       numero_contrat= 5555; 	annee= 2008; 	montant= 0; 	output;
    run;
     
    proc sort data=test;
       by numero_contrat annee;
    run;
     
    data test2;
       set test;
       by numero_contrat annee;
       if not (first.annee and last.annee) and montant=0 then delete;
    run;
    Si il n'y a qu'une ligne, on la garde quel que soit le montant et s'il y en a plusieurs (first and last pas sur la même ligne) alors tu regardes si le montant est nul et s'il est nul, tu supprimes la lignes.

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 35
    Par défaut somme cumulée
    génial, merci beaucoup, c'est exactement ça que je voulais!


    il va tout de même falloir que je trouve une façon de faire la somme cumulée comme je l'ai expliqué plus haut,
    des idées?

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Par défaut
    Pour faire le cumul par contrat et année dans une nouvelle colonne, tu peux utiliser un retain.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    data test2;
       set test;
       by numero_contrat annee;
       retain somme 0;
       if not (first.annee and last.annee) and montant=0 then delete;
       if first.annee then somme=0;
       somme+montant;
    run;

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

Discussions similaires

  1. Suppression de lignes avec critère
    Par crespo12 dans le forum Lisp
    Réponses: 1
    Dernier message: 28/03/2012, 12h01
  2. [XL-2003] Macro de suppression de ligne avec un mot
    Par harisman87 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/07/2010, 16h50
  3. [WD-2007] Modèle Word - Suppression de ligne avec puce si vide
    Par vincent DD dans le forum Word
    Réponses: 1
    Dernier message: 26/08/2009, 22h14
  4. Suppression des lignes avec condition
    Par tientinou dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/03/2009, 12h35
  5. suppression des lignes avec sed
    Par dngaya dans le forum Linux
    Réponses: 1
    Dernier message: 29/09/2008, 21h23

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