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 :

Comment faire une condition sur deux lignes différentes ?


Sujet :

SAS Base

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 5
    Points : 7
    Points
    7
    Par défaut Comment faire une condition sur deux lignes différentes ?
    Bonjour tous le monde,

    Je ne sais pas comment résoudre la problème suivant.


    Ma base de données contient les dates d'abonnement (par année fiscale) des membres pour une période de 10 ans.
    Pour chaque année, je dois calculer combien de membre se sont réabonnés dans la même année que la fin de leur abonnement et combien l'ont fait dans une année différente.

    Dossier Debut Fin
    21 2003 2004
    110 2003 2004
    110 2005 2006
    153 2008 2009
    153 2009 2010
    153 2010 2011
    153 2012 2012
    154 2006 2008
    154 2008 2009
    154 2011 2012
    154 2012 2014

    J'aimerais avoir une réponse comme dans l'exemple qui suit. Avec ces chiffres, je vais pouvoir calculer le taux de renouvellement des membres d'un musée.

    Dossier Debut Fin Reabon_meme_an Reabon_dif_an An_Reabon
    21 2003 2004 . . .
    110 2003 2004 . . .
    110 2005 2006 . 1 2005
    153 2008 2009 . . .
    153 2009 2010 1 . 2009
    153 2010 2011 1 . 2010
    153 2012 2012 . 1 2012
    154 2006 2008 . . .
    154 2008 2009 1 . 2008
    154 2011 2012 . 1 2011
    154 2012 2014 1 . 2012

    J'espère que ma question est compréhensible.

    Merci
    Fichiers attachés Fichiers attachés

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

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

    Tu peux utiliser la fonction lag pour comparer tes valeurs à celles de la ligne précédente.

    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
     
    data test;
       Dossier=21; Debut=2003; Fin=2014; output;
       Dossier=110; Debut=2003; Fin=2014; output;
       Dossier=110; Debut=2005; Fin=2006; output;
       Dossier=153; Debut=2008; Fin=2009; output;
       Dossier=153; Debut=2009; Fin=2010; output;
       Dossier=153; Debut=2010; Fin=2011; output;
       Dossier=153; Debut=2012; Fin=2012; output;
       Dossier=154; Debut=2006; Fin=2008; output;
       Dossier=154; Debut=2008; Fin=2009; output;
       Dossier=154; Debut=2011; Fin=2012; output;
       Dossier=154; Debut=2012; Fin=2014; output;
    run;
     
    data test2 (drop=finbis);
       set test;
       finbis=lag(fin);
       if lag(dossier)=dossier then do;
          if finbis=debut then Reabon_meme_an=1;
          else Reabon_dif_an =1;
          An_Reabon=debut;
       end;
    run;

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    C'est aussi une solution avec la fonction LAG :
    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
    25
    26
    27
     
    data abonnement ;
    input Dossier Debut Fin	;
    cards ;
    21  2003 2004
    110 2003 2004
    110 2005 2006
    153 2008 2009
    153 2009 2010
    153 2010 2011
    153 2012 2012
    154 2006 2008
    154 2008 2009
    154 2011 2012
    154 2012 2014
    ; run ;
     
    proc sort data=abonnement ; by dossier ; run  ;
     
    data abonnement_  (drop=lag_fin) ;
    set  abonnement ;  by dossier ; 
    lag_fin=lag(fin) ;
    Reabon_meme_an=0 ;	Reabon_dif_an =0 ;
    if first.dossier then call missing(lag_fin) ;
    if (Debut-lag_fin)=0 then do ; Reabon_meme_an=1 ; An_Reabon=Debut ; end ;
    if (Debut-lag_fin)>0 then do ; Reabon_dif_an =1 ; An_Reabon=Debut ; end ;
    run  ;
    Cdt Ward

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par bab22 Voir le message
    Bonjour,

    Tu peux utiliser la fonction lag pour comparer tes valeurs à celles de la ligne précédente.

    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
     
    data test;
       Dossier=21; Debut=2003; Fin=2014; output;
       Dossier=110; Debut=2003; Fin=2014; output;
       Dossier=110; Debut=2005; Fin=2006; output;
       Dossier=153; Debut=2008; Fin=2009; output;
       Dossier=153; Debut=2009; Fin=2010; output;
       Dossier=153; Debut=2010; Fin=2011; output;
       Dossier=153; Debut=2012; Fin=2012; output;
       Dossier=154; Debut=2006; Fin=2008; output;
       Dossier=154; Debut=2008; Fin=2009; output;
       Dossier=154; Debut=2011; Fin=2012; output;
       Dossier=154; Debut=2012; Fin=2014; output;
    run;
     
    data test2 (drop=finbis);
       set test;
       finbis=lag(fin);
       if lag(dossier)=dossier then do;
          if finbis=debut then Reabon_meme_an=1;
          else Reabon_dif_an =1;
          An_Reabon=debut;
       end;
    run;
    Merci beaucoup, je n'avais jamais utilisé cette fonction. Je crois que je vais m'en servir souvent.

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par hossward Voir le message
    Bonjour,
    C'est aussi une solution avec la fonction LAG :
    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
    25
    26
    27
     
    data abonnement ;
    input Dossier Debut Fin	;
    cards ;
    21  2003 2004
    110 2003 2004
    110 2005 2006
    153 2008 2009
    153 2009 2010
    153 2010 2011
    153 2012 2012
    154 2006 2008
    154 2008 2009
    154 2011 2012
    154 2012 2014
    ; run ;
     
    proc sort data=abonnement ; by dossier ; run  ;
     
    data abonnement_  (drop=lag_fin) ;
    set  abonnement ;  by dossier ; 
    lag_fin=lag(fin) ;
    Reabon_meme_an=0 ;	Reabon_dif_an =0 ;
    if first.dossier then call missing(lag_fin) ;
    if (Debut-lag_fin)=0 then do ; Reabon_meme_an=1 ; An_Reabon=Debut ; end ;
    if (Debut-lag_fin)>0 then do ; Reabon_dif_an =1 ; An_Reabon=Debut ; end ;
    run  ;
    Cdt Ward
    Super, je vais aussi garder cette solution en référence.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/05/2014, 12h38
  2. Réponses: 5
    Dernier message: 15/03/2014, 18h08
  3. Comment concevoir une application sur deux plateformes différentes ?
    Par Fab4v dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 21/02/2014, 17h46
  4. Réponses: 2
    Dernier message: 03/02/2014, 09h38
  5. Réponses: 22
    Dernier message: 10/07/2011, 17h49

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