Vous n'êtes pas identifié.
Vous êtes sur le forum du master ESA !
Le site du master ESA - description de la formation, notes de cours, contacts... vient de déménager !!!
Venez visiter notre nouveau site : www.master-esa.fr
Bonjour,
Je voudrais passer une liste de dates via une macro variable. Je soupçonne que je me prends la tête et qu'il doit y avoir une solution plus simple....
proc sql noprint;
select distinct date_alim
into :liste_dates separated by ' "d," '
from malib.matable
order by date_alim
;
quit;
%let quotes1 = %str(%");
%let quotes2 = %str(%"d);
%let liste_dates1 = %bquote("es1.&liste_dates"es2);
data mytable2;
set malib.matable ( where = (date_alim in ( &liste_dates1. ))) ;
run;
... et bien sûr que ça marche pas. L'erreur que j'obtiens avec cette version du code est "Missing parenthesis for data set option list", alors que pas du tout...
Ce que je comprends pas c'est qu'avec une autre macro-variable avec exactement les mêmes valeurs, mais déclarée explicitement, ça marche :
%let liste_dates_ok = "01MAY2017"d, "02MAY2017"d ;
data mytable2;
set malib.matable ( where = (date_alim in ( &liste_dates_ok. ))) ;
run;
On dirait que ces deux variables, &liste_dates_ok et &liste_dates1 sont exactement égales quand je fais %put, mais dans l'instruction, la deuxième ne marche pas.
En fait, quand je crée ces macrovariables, j'ai plein d'avertissements "The meaning of an identifier after a quoted string might change in a future SAS release. Inserting white space between a quoted string and the succeeding identifier is recommended."
Précisions :
- j'ai essayé avec et sans le bquote, c'est pareil
- j'ai essayé avec simples cotes et doubles cotes, c'est pareil
- je ne peux pas changer le format des dates dans la table malib.matable, parce qu'en fait c'est une table dans une librairie SQL Server
- je veux utiliser la liste plutôt dans une proc imstat pour charger des données sur un serveur LASR, mais c'est pareil pour une simple étape data
Merci d'avance pour toute suggestion !
Hors ligne
Salut Ana,
J'y connais rien aux formats/informats de date dans sql server mais apparemment elles sont de la forme JJMONYYYY, tu devrais essayer un truc comme ça :
proc sql noprint;
select distinct '"'||date_alim||'"d'
into :liste_dates separated by ' '
from malib.matable_avec_les_dates_que_je_veux
;/*Pas besoin d'un order */
quit;
data mytable2;
set malib.matable ( where = (date_alim in ( &liste_dates. ))) ;
run;
Et si proc sql renvoie une erreur parce que tu utilises un opérateur caractère (||) avec une variable numérique, il faudrait essayer select distinct '"'||put(date_alim,format approprié ou juste un $)||'"d'
Pour info:
"The meaning of an identifier after a quoted string might change in a future SAS release. Inserting white space between a quoted string and the succeeding identifier is recommended."
Les développeurs de SAS sont bienveillants, ils te préviennent juste que tu devrais éviter d'utiliser dans ta syntaxe un quote/doublequote suivi d'une lettre type une date: "..."d, une datetime : ".."dt, un nom littéral: '....'n au cas où dans une prochaine version ils en inventeraient un autre
Et une dernière chose, en relisant ton code j'ai l'impression que SAS sait déjà que date_alim est une date donc une variable numérique donc...:
proc sql noprint;
select distinct date_alim
into :liste_dates separated by ' '
from malib.matable_avec_les_dates_que_je_veux
;/*Pas besoin d'un order */
quit;
data mytable2;
set malib.matable ( where = (date_alim in ( &liste_dates. ))) ;
run;
...devrait marcher !
En espérant t'avoir aidé.
Bon courage
Dernière modification par gozgoz (15-05-2017 17:56:03)
Hors ligne
on va faire TRES simple (parce que vous vous compliquez énormément la vie...)
data test; do date='01jan2017'd to '10jan2017'd; output; end; format date ddmmyy10.; run; proc sql ; select distinct date format=8. into :liste_date separated by ' ' from test; run; proc print data=test(where=(date in (&liste_date))); run;
et voilà !
Hors ligne
Merci beaucoup pour votre réactivité !
Effectivement, la solution la plus simple marche le mieux
Hors ligne
Hors ligne