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

Macro Discussion :

Sommes cumulées successives


Sujet :

Macro

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2013
    Messages : 55
    Points : 65
    Points
    65
    Par défaut Sommes cumulées successives
    Bonjour à tous,

    Je cherche à faire une somme cumulée sur une série de variables. J'ai le programme suivant pour une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DATA TAB2;
    SET TAB2;
     
    RETAIN X_CUMULE 0;
    X_CUMULE = X_CUMULE + X;
    RUN;
    Ce prog me fait bien une somme cumulée, mais je voudrais aussi qu'à passage à JANV (N+1) X_CUMULE prenne la valeur en JANV de X et recommence à sommer..
    Je ne sais pas si j'ai été clair mais voilà un visuel de ce que je veux en sortie --> (fichier joint)
    Fichiers attachés Fichiers attachés

  2. #2
    Membre régulier
    Femme Profil pro
    Chargée d'études
    Inscrit en
    Septembre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargée d'études
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2015
    Messages : 22
    Points : 107
    Points
    107
    Par défaut
    Bonjour,

    Si je comprends bien grâce à votre fichier joint vous souhaitez faire une somme cumulée selon l'année de votre date.
    Je vous propose le programme suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    data tab2; set tab2;
    annee=year(date);
    run;
     
     proc sort data=tab2 out=tab3;
     by annee; 
     run;
     
     data tab3; set tab3 ;
     by annee;
     RETAIN X_CUMULE 0;
     if first.annee then X_CUMULE=0;
     X_CUMULE = X_CUMULE + X;
     run;
    Cordialement,

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2013
    Messages : 55
    Points : 65
    Points
    65
    Par défaut
    Bjr Elodie,

    J'ai testé ta proposition. Elle fonctionne bien et me rend ce que j'ai demandé. merci beaucoup.
    J'essaie maintenant de généraliser le programme sur une liste de variables pour lesquelles je voudrais aussi calculer des cumuls.
    Il faudrait aussi que les cumuls se fassent par réseau, puis par segment et enfin par année.
    J'ai donc fait évoluer ton programme comme suit :

    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
    DATA TAB;
    SET Table;
    BY RESEAU SGT ANNEE;
     
    ARRAY VAR {*} X Y Z;
    ARRAY CUM {*} X_CUMULE Y_CUMULE Z_CUMULE;
     
    RETAIN X_CUMULE Y_CUMULE Z_CUMULE (0);
     
    DO i=1 TO DIM(CUM);
     
         DO j=1 TO DIM(VAR);
     
         IF (FIRST.ANNEE) THEN CUM{i} = 0; 
         CUM{i} = CUM{i} + VAR{j};
     
         END;
     
    END;
    RUN;
    Ce prog ne me rend évidemment pas ce que je veux. Est ce que le RETAIN est bien écrit ? Quelles conditions devrais je ajouter pour prendre en compte le réseau, le segment puis l'année ?
    Toute autre approche serait également la bienvenue

    merci à tous

  4. #4
    Membre régulier
    Femme Profil pro
    Chargée d'études
    Inscrit en
    Septembre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargée d'études
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2015
    Messages : 22
    Points : 107
    Points
    107
    Par défaut
    Bonjour Joan,

    Dans ton programme tu n'as pas besoin de faire 2 boucles do (i suffit), mais il faut changer la variable du first. à chaque fois (ce que je n'ai pas réussi à faire avec un array)
    Donc il existe peut être une meilleure solution mais je te propose ce programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DATA TAB;
    SET Table;
    BY RESEAU SGT ANNEE;
    RETAIN X_CUMULE Y_CUMULE Z_CUMULE (0);
     
     if first.reseau then X_CUMULE=0;
     X_CUMULE = X_CUMULE + X;
      if first.sgt then y_CUMULE=0;
     y_CUMULE = y_CUMULE + y;
       if first.annee then z_CUMULE=0;
     z_CUMULE = z_CUMULE + z;
     run;
    Bonne journée

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

    Est-ce que la réponse d'Elodie correspondait à ce que tu souhaitais ?
    Si la demande était de faire un regroupement par triplet reseau,sgt, annee, il suffit de faire un proc sort sur ces 3 variables en amont et de ne mettre que la dernière dans le first.

    Exemple avec seulement 2 variables :
    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
    data table_test;
    	input reseau annee x y z; 
    	cards;
    	1 2012 1 2 3
    	1 2012 3 4 5
    	1 2012 5 7 8
    	1 2013 3 6 9
    	1 2013 2 5 7
    	1 2013 5 5 5
    	2 2012 9 5 1
    	2 2012 8 5 2
    	2 2012 7 5 3
    	2 2013 7 4 1
    	2 2013 2 5 8
    	2 2013 5 7 9
    	;
    run;
    proc sort data=table_test;
    	by reseau annee;
    quit;
     
    DATA TAB;
    	SET Table_test;
    	BY RESEAU ANNEE;
     
    	ARRAY VAR {*} X Y Z;
    	ARRAY CUM {*} X_CUMULE Y_CUMULE Z_CUMULE;
     
    	RETAIN X_CUMULE Y_CUMULE Z_CUMULE (0);
     
    	DO i=1 TO DIM(VAR);
    	     IF (FIRST.ANNEE) THEN CUM{i} = 0; 
    	     CUM{i} = CUM{i} + VAR{i};
    	END;
    	drop i;
    RUN;
    Attention, ce n'est pas pour faire la même chose que le programme d'Elodie, c'est moi qui ai interprété différemment la demande.

Discussions similaires

  1. somme cumulative su BO reporter
    Par cricri2607 dans le forum Débuter
    Réponses: 4
    Dernier message: 26/11/2008, 11h40
  2. Somme cumulative sur 12 mois glissant
    Par Ptij16 dans le forum Deski
    Réponses: 6
    Dernier message: 13/07/2007, 10h24
  3. somme cumulative sql
    Par marcdonaldwilfried dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/04/2007, 12h25
  4. ! Somme Cumulative en SQL !
    Par dom283 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2007, 18h25
  5. somme cumulative
    Par gsquad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/04/2006, 17h18

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