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 :

Requête sur une période


Sujet :

SAS Base

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 57
    Points : 37
    Points
    37
    Par défaut Requête sur une période
    Bonjour,

    J'ai besoin de modifier une macro sas, sachant que je ne connais presque rien à sas.
    Bref, j'importe le contenu d'un fichier dans une table sas, dont une colonne au format alpha sous le schéma "JJ/MM/AAAA HH:MM".

    J'ai besoin de faire ensuite une extraction sur une période donnée.
    J'ai donc créé une nouvelle donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    periode=INPUT(substr(dateX,1,10), DDMMYY10.);
    lors de l'intégration de mon fichier.
    Puis j'ai voulu créer une nouvelle table SAS avec comme tri :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    %let periodedeb = INPUT(compress('01'||'/'||&MOISDEB||'/'||&ANDEB), DDMMYY10.);
    %let periodefin = INPUT(compress('01'||'/'||&MOISFIN||'/'||&ANFIN), DDMMYY10.);
     
    data extract;
        set fullextract (where=(periode BETWEEN &periodedeb AND &periodefin)) ;
    run;
    sachant que moisdeb etc sont les paramètres de la macro.

    Mais j'ai beau tout essayer, tracer, etc, ça ne fonctionne pas, j'ai droit à "ERREUR: L'opérateur de la clause where requiert des variables alphan."
    J'ai tout essayé, en passant par un format date, alpha, bref, je suis complètement perdu.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 249
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Lors de l'import du fichier, il suffit de préciser l'informat de la donnée (comment la lire) à SAS du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    periode=INPUT(dateX,DATETIME.);
    Cet informat permet à SAS de traduire la donnée lue en nombre de secondes écoulées depuis le premier janvier 1960 à zéro heure.

    Pour extraire la partie date de l'objet date-time :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ladate=DATEPART(periode);
    Pour exprimer à SAS un date-time (qu'il traduit donc en un nombre de secondes etc...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "06APR2009:00:00:00"DT /* Objet DateTime */
    "06APR2009"D  /* Objet Date exprimée en nb de jours écoulés depuis 01/01/1960*/
    Le jour sur deux caractères, le mois sur trois caractères (mois en anglais!), l'année sur 4 caractères, les heures, les minutes et les secondes sur 2 caractères le tout entre quotes et suivi de DT (pour DATETIME!).

    On peut alors faire de beaux tests dans de beaux macro-programmes sans "bricoler" les données...

    Bon courage !

  3. #3
    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 : 46
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Ton code n'est pas loin du compte, mais il faut comprendre que le compilateur macro, par défaut, ne fait aucun calcul, juste du copier/coller. Donc la formule que tu donnes après ton %LET ... = ne sera pas évaluée, juste mise en mémoire (les &macro-variables seront juste remplacées par leurs valeurs) et injectées ensuite dans le WHERE.
    Tu pourrais donc directement écrire tes INPUT dans le WHERE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DATA extract;
        SET fullextract (WHERE=(periode BETWEEN INPUT(compress('01'||'/'||"&MOISDEB"||'/'||"&ANDEB"), DDMMYY10.)
                                                     AND INPUT(compress('01'||'/'||"&MOISFIN"||'/'||"&ANFIN"), DDMMYY10.))) ;
    run;
    Il fallait juste rajouter des "..." autour des &MOISDEB et compagnie, pour que SAS voie juste du texte à concaténer avec le reste. Par contre, pas de '&MOISDEB' parce que les guillemets simples interdisent le remplacement des macro-variables par leur valeur.
    Pour alléger un peu le code, je te proposerais d'utiliser la fonction MDY, qui prend comme arguments le mois, le jour, l'année (tous numériques) et renvoie une date SAS. Ca évitera les concaténations et les INPUT et les guillemets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DATA extract;
        SET fullextract (WHERE=(periode BETWEEN MDY(&MOISDEB, 1, &ANDEB)
                                                     AND MDY(&MOISFIN, 1, &ANFIN))) ;
    run;
    Bon courage.
    Olivier
    Bon courage.
    Olivier

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Merci de votre aide.
    Effectivement, je ne maitrise pas vraiment le principe des variables et du formatage de SAS, mais ça va venir.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/01/2015, 08h15
  2. Réponses: 0
    Dernier message: 25/06/2013, 15h03
  3. Lancer une requête sur une période
    Par loho87 dans le forum Designer
    Réponses: 3
    Dernier message: 22/10/2010, 14h49
  4. Requête sur une partie d'un champ
    Par KEROZEN dans le forum Access
    Réponses: 4
    Dernier message: 26/03/2006, 20h50
  5. Requête sur une requête dynamique...
    Par kluh dans le forum Access
    Réponses: 4
    Dernier message: 17/11/2005, 19h59

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