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ébutez Discussion :

Incrémentation de valeurs


Sujet :

Débutez

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2015
    Messages : 54
    Points : 22
    Points
    22
    Par défaut Incrémentation de valeurs
    Bonjour,


    Je cherche un moyen d'obtenir plusieurs valeurs en fonction d'une seule autre. Supposons que ma valeur est 1602, sous - entendu le mois de février 2016.
    J'aimerais trouver un moyen d'obtenir ces mêmes valeurs pour les 6 mois précédents. C'est à dire les valeurs : 1601, 1512, 1511, 1510, 1509, 1508.

    Et ainsi pouvoir intégrer ces valeurs directement dans ma création de table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data want;
    set tab_1508
        tab_1509 
        tab_1510 
        tab_1511 
        tab_1512 
        tab_1601;
    run;
    J'ai quelques idées de comment m'y prendre, notamment en décomposant ce chiffre en deux parties et à jouer avec les boucles, mais débutant sur SAS, j'ai un peu de mal à coder une solution qui fonctionne.

    Mac_Leod.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2015
    Messages : 54
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    J'ai écrit mon code de bout en bout mais il n'est absolu pas optimisé. Je suis persuadé qu'il est possible de le réduire en utilisant une boucle / une macro, mais sans réussite pour le moment.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    %macro _suivi_periode(varA, varB);
     
     
      %if        %substr(&varA.,3,2) ne 01 %then %do;	  %let varA1 = %eval(&varA.-1);                  %end;
      %else  %if %substr(&varA.,3,2) eq 01 %then %do;   %let varA1 = %eval(%substr(&varA.,1,2)-1)12;   %end;
     
      %if        %substr(&varA1.,3,2) ne 01 %then %do;	 %let varA2 = %eval(&varA1.-1);                 %end;
      %else  %if %substr(&varA1.,3,2) eq 01 %then %do;   %let varA2 = %eval(%substr(&varA1.,1,2)-1)12;  %end;
     
      %if        %substr(&varA2.,3,2) ne 01 %then %do;	 %let varA3 = %eval(&varA2.-1);                 %end;
      %else  %if %substr(&varA2.,3,2) eq 01 %then %do;   %let varA3 = %eval(%substr(&varA2.,1,2)-1)12;  %end;
     
      %if        %substr(&varA3.,3,2) ne 01 %then %do;	 %let varA4 = %eval(&varA3.-1);                 %end;
      %else  %if %substr(&varA3.,3,2) eq 01 %then %do;   %let varA4 = %eval(%substr(&varA3.,1,2)-1)12;  %end;
     
      %if        %substr(&varA4.,3,2) ne 01 %then %do;	 %let varA5 = %eval(&varA4.-1);                 %end;
      %else  %if %substr(&varA4.,3,2) eq 01 %then %do;   %let varA5 = %eval(%substr(&varA4.,1,2)-1)12;  %end;
     
     
    	%let year = 20%substr(&varA., 1, 2); 
     
     
      %if        &varB. ne 01 %then %do;	   %let varB1 = %sysfunc(putn(%eval(&varB.-1), z2.));   %let  year1 = &year.;     %end;
      %else  %if &varB. eq 01 %then %do;     %let varB1 = 13; %let  year1 = %eval(&year.-1);                                %end;  
     
      %if        &varB1. ne 01 %then %do;	   %let varB2 = %sysfunc(putn(%eval(&varB1.-1), z2.));  %let  year2 = &year1.;    %end;
      %else  %if &varB1. eq 01 %then %do;    %let varB2 = 13; %let  year2 = %eval(&year1.-1);                               %end;  
     
      %if        &varB2. ne 01 %then %do;	   %let varB3 = %sysfunc(putn(%eval(&varB2.-1), z2.));  %let  year3 = &year2.;    %end;
      %else  %if &varB2. eq 01 %then %do;    %let varB3 = 13; %let  year3 = %eval(&year2.-1);                               %end;  
     
      %if        &varB3. ne 01 %then %do;	   %let varB4 = %sysfunc(putn(%eval(&varB3.-1), z2.));  %let  year4 = &year3.;    %end;
      %else  %if &varB3. eq 01 %then %do;    %let varB4 = 13; %let  year4 = %eval(&year3.-1);                               %end;  
     
      %if        &varB4. ne 01 %then %do;	   %let varB5 = %sysfunc(putn(%eval(&varB4.-1), z2.));  %let  year5 = &year4.;    %end;
      %else  %if &varB4. eq 01 %then %do;    %let varB5 = 13; %let  year5 = %eval(&year4.-1);                               %end;  
     
     
     
     %mend _suivi_periode;
     
    %_suivi_periode(1704, 04);

    Il y a eu un ajout entre temps mais le principe reste le même. Je cherche à incrémenter mes variables varA, varB et year.
    Les règles pour chacune de celles - ci :

    varA : Si deux derniers chiffres = 01 alors, soustraire de 1 les deux premiers chiffres et initialiser à 12 les deux derniers (suite logique recherchée : 1704, 1703, 1702, 1701, 1612, 1611).
    varB : Si égal à 01, alors initialiser à 13 le suivant (suite logique recherchée : 04, 03, 02, 01, 13, 12)
    year : Si varB = 01, alors soustraire une année (suite logique recherchée : 2017, 2017, 2017, 2017, 2016, 2016).

    J'ai pas l'impression d'être clair, n'hésitez pas si besoin d'infos supplémentaires. Mais en tout les cas, le code fonctionne et me donne les résultats escomptés. Je cherche juste à le simplifier.

  3. #3
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    Tu peux regarder si tu arrives à adapter ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    %macro test(mv1);
    data test&mv1.;
     	%do i=1 %to 2;
    		truc_&i. = (((&mv1.-mod(%eval(&mv1.),100)))/100-(mod(%eval(&mv1.),100)-&i.<1))*100 + 
    					mod(12+mod(%eval(&mv1.),100)-&i.-1,12)+1;	
    	%end;	
    run;
    %mend;
    %test(1602);
    Il faut encore réussir à stocker le résultat des opérations non pas dans une variable comme dans cet exemple mais dans une macrovariable. Le tour serait alors joué !

  4. #4
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    Pour compléter, voici comment on peut s'en sortir (mais il y a peut-être plus simple encore) :

    Jeu de données :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    data ruine1601;
    input a b;
    cards;
    1 1 
    2 2 
    3 3 
    ;
    run;
     
    data ruine1512;
    input a b;
    cards;
    5 5 
    6 6 
    7 7 
    ;
    run;
     
    data ruine1511;
    input a b;
    cards;
    9 9 
    9 9 
    9 9 
    ;
    run;
     
    data ruine1510;
    input a b;
    cards;
    11 11
    19 19 
    19 19 
    ;
    run;
     
    data ruine1509;
    input a b;
    cards;
    29 29 
    29 92 
    29 92 
    ;
    run;
    Programme :
    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
    %macro test(mv1,retro);
    data null;
     %do i=1 %to &retro.;
    	%let nb_&i. = %eval((((&mv1.-%sysfunc(mod(%eval(&mv1.),100))))/100-(%sysfunc(mod(%eval(&mv1.),100))-&i.<1))*100 + 
    				%sysfunc(mod(12+%sysfunc(mod(%eval(&mv1.),100))-&i.-1,12))+1);
    	%let truc_&i. = ruine&&nb_&i.;	
    %end;
    run;	
    data test&mv1.;
    	set %do nb=1 %to &retro.;
    		&&truc_&nb. 
    		%end; ;
    run;
    %mend;
    %test(1602,5);
    Avec retro comme macrovariable pour définir le nombre de mois précédents qu'on veut aller chercher.

  5. #5
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Est ce que ceci peut t'aider?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    %macro test(st,nbr);
    data tab_mois (drop=month);
      length date 4. ;
       format date  yymmn4.;
        do month=1 to &nbr ;
        date = intnx('month',input(put(&st,4.),yymmn4.),-month,'b');
        output;
      end;
    run;
    %mend;
    %test(1505,6);
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

Discussions similaires

  1. [MySQL] Incrémenter la valeur d'un champ (1,2,3 etc)d'une table dés appel d'une page PHP
    Par bilou95 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/11/2007, 17h08
  2. Réponses: 6
    Dernier message: 18/11/2007, 17h30
  3. Incrémenter la valeur d'une cellule d'un simple clic
    Par Amiral19 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 20/07/2007, 15h21
  4. Réponses: 2
    Dernier message: 23/07/2006, 22h11
  5. [VBA-E] incrémenter des valeurs excel grâce à des boutons
    Par keiserjo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/07/2006, 11h32

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