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 :

Boucle avec incrément de date


Sujet :

SAS Base

  1. #1
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Par défaut Boucle avec incrément de date
    Bonjour,

    J'ai besoin d'un sérieux coup de main. Voilà ce que je veut faire :

    Je souhaite créer une table dans laquelle je vais ajouter des lignes. Chaque ajout de ligne correspond à une requête. Entre 2 requêtes ce qui change c'est la date maximum, je souhaite l'incrémenter d'une semaine à chaque fois.

    DOnc j'ai besoin d'une boucle qui incrémente ma date max de 7 jours à chaque fois.

    En gros mon algo ce serais en français :
    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
     
     
    Datedépart = 07DEC2008
     
    Create table De_Base 
    Select Datedépart as date, count(distinct de Matricule)
    From table1 as a, table2 as b
    Where a.date_Enregistrement <= Datedépart
    Group by Date
     
    Date_incrémentée = Datedépart + 7 jours
     
    Tant que Date_d'aujourd'hui > Date_incrémentée
     
    INSERT into table De_Base 
    Select Datedépart as date, count(distinct de Matricule)
    From table1 as a, table2 as b
    Where a.date_Enregistrement <= Date_incrémentée 
    Group by Date
     
    Date_incrémentée = Date_incrémentée+ 7 jours
     
    Fin Tant que

    Voilà ... si quelqu'un peut m'aider pour le code sas ... parce que là je sèche.

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Par défaut RE Boucle avec incrementation de date
    Je comprend pas bien ce que tu veux faire.
    Par exemple des mêmes de la table a (table1) seront insérées plusieurs fois dans la la table d_base.

    En plus je vois pas la contribution de la table b (table2).

    Mais voici un pseudo code en espérant que ça 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
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    proc sql;
    create table d_base as select datedepart as date, count(distinct matricule)
    from table1 as a, table 2 as b
    WHERE a.date_Enregistrement <= "07dec2008"d
    GROUP BY Date;
    quit;
     
    data _null_;
    	date_incrementee="07dec2008"d +7; 
    	do while date() > date_incrementee;
     
    		proc sql;
    	        	INSERT INTO De_Base 
    			SELECT Datedepart AS date,  count(DISTINCT matricule)
    			FROM table1 AS a, table2 AS b
    			WHERE a.date_Enregistrement <= Date_incrementee 
    			GROUP BY Date
    		quit;
     
    		date_incrementee=date_incrementee+7;
    	end;
    run;

    Bonne chance!

    Sidi.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Par défaut
    Bonjour,

    MErci de votre réponse. Un soucis qu'elle ne résoud pas, c'est l'insertion d'une variable par exemple &Date_Départ (j'aurais du mettre les &) dans une Proc SQL. Je sais même pas si c'est possible en fait.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 233
    Par défaut
    Quel est le problème exacte avec l'insertion d'une date ?
    Juste pour info : il n'y a pas de type de données "date" chez SAS, les dates sont des numériques (comme en Excel, d'ailleurs). Par contre, tu peux toujours appliquer un format spécifique pour qu'un nombre quelconque soit interprété comme le nombre de jours à partir de 01/01/1960 (je peux me tromper sur la date de départ, ce n'est pas important).
    Donc, pour insérer une date, tu fais la même chose que tu fais pour insérer un nombre.

    Et bien sûr, les instructions macro sont acceptées dans le code de la proc sql.
    Pareil, pour info : les instructions macro sont interprétées avant tout autre chose, ils génèrent du texte qui sera interprété à son tour comme le code SAS. Quelles que soient les procédures que tu utilises.

  5. #5
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Avant que tout le monde sur ce forum ne sorte ses macros et ses %, je voulais juste signaler qu'on peut faire les choses en 2 étapes : 1) créer une table des dates auxquelles on veut faire des pointages (avec une boucle DO, c'est tout simple) et 2) un produit presque cartésien entre la table A et cette table de dates, assortie d'un comptage et d'un GROUP BY.
    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
    DATA work.a ;
    	INPUT matricul $ date_Enregistrement :DDMMYY10. ;
    	FORMAT date_: DDMMYY10. ;
    CARDS ;
    00001 03/12/2006
    00002 05/01/2009
    00003 28/12/2008
    00004 22/01/2009
    ;
    RUN ;
    DATA work.dates ;
    	FORMAT dateDepart DDMMYY10. ;
    	DO dateDepart = "07DEC2008"d TO TODAY() BY 7 ;
    		OUTPUT ;
    	END ;
    RUN ;
    PROC SQL ;
    	SELECT dates.dateDepart,
    		   COUNT(DISTINCT matricul) AS nBMat
    	FROM work.dates,
    		 work.a
    	WHERE a.date_Enregistrement <= dates.dateDepart
    	GROUP BY dateDepart
    	;
    QUIT ;
    Olivier

  6. #6
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    Avant que tout le monde sur ce forum ne sorte ses macros et ses %, je voulais juste signaler qu'on peut faire les choses en 2 étapes : 1) créer une table des dates auxquelles on veut faire des pointages (avec une boucle DO, c'est tout simple) et 2) un produit presque cartésien entre la table A et cette table de dates, assortie d'un comptage et d'un GROUP BY.

    Olivier

    Simple ! Fonctionnel ! Extraordinaire

    Merci bcp ca marche parfaitement !


    Juste en plus, est ce que quelqu'un peut me montrer comment on insère une variable dans une proc SQL ? genre je déclare un entier et je l'utilise dans la proc.

    Merki !

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Par défaut
    Bonjour,

    Tu peux définir ta variable comme une macro variable comme suivant par exemple:


    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
    /* Création d'une data set avec une seulle variable x */
    data matable;
    	x=1;
    run;
     
     
    /* Définition d'une macro variable contenant la valeur 5 */
    data _null_;
    	call symput('mavariable', 5);
    run;
     
     
    /* Insertion du macro variable dans la data set */
    proc sql;
    	insert into matable values(&mavariable.);
    quit;
     
    /* Test si la macro variable est bien inserée dans la table */
    proc print data=matable;
    run;
    Bonne chance!

    Sidi.

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

Discussions similaires

  1. Boucle for avec incrément supérieur à 1
    Par bremer dans le forum Langage
    Réponses: 19
    Dernier message: 22/04/2024, 12h41
  2. [Smarty] Boucle FOR avec incrémentation
    Par HwRZxLc4 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/07/2010, 20h31
  3. Boucle avec dates
    Par Telecaster dans le forum Langage
    Réponses: 3
    Dernier message: 01/01/2009, 12h24
  4. Réponses: 8
    Dernier message: 05/12/2008, 11h43
  5. Boucle avec incrément
    Par popi9987 dans le forum Débuter
    Réponses: 5
    Dernier message: 02/11/2008, 17h13

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