Date 由于数据类型不同,对SAS日期宏的引用不起作用
希望能在这方面有所帮助 目前,该查询使用以下命令为m1-m6和d1-d6创建引用Date 由于数据类型不同,对SAS日期宏的引用不起作用,date,macros,sas,Date,Macros,Sas,希望能在这方面有所帮助 目前,该查询使用以下命令为m1-m6和d1-d6创建引用 %let m1=1114; %let d1 ='30NOV2014'd; %let m2=1214; %let d2='31DEC2014'd; %let m3=0115; %let d3='31JAN2015'd; %let m4=0215; %let d4='28FEB2015'd; %let m5=0315; %let d5='31MAR2015'd; %let m6=0415; %let d6='30APR
%let m1=1114;
%let d1 ='30NOV2014'd;
%let m2=1214;
%let d2='31DEC2014'd;
%let m3=0115;
%let d3='31JAN2015'd;
%let m4=0215;
%let d4='28FEB2015'd;
%let m5=0315;
%let d5='31MAR2015'd;
%let m6=0415;
%let d6='30APR2015'd;
根据代码的其余部分,m1-m6日期的格式必须为mmyy。我尝试用以下内容替换上述内容:
data _datemacro_;
m1 = put(intnx('day','01NOV2014'd,0),mmyyn4.);
call symput('m1',"'"||put(m1,9.)) ;
d1 = put(intnx('day','30NOV2014'd,0),date9.);
call symput('d1',"'"||put(d1,9.)) ;
m2 = put(intnx('day',&d1,+1),mmyyn4.);
call symput('m2',"'"||put(m2,9.)) ;
d2 = put(intnx('month',&d1,+1,'e'),date9.);
call symput('d2',"'"||put(d2,9.)||"'"||"d") ;
...etc through m6 and d6
run;
下面是产生各种错误的代码的其余部分,包括
错误22-322:语法错误,应为以下内容之一:名称
带引号的字符串,(,/,;,数据,最后一个,NULL
错误200-322:符号无法识别,将被忽略
我能够让它精确地运行到最后6行,仅运行这6行就产生了78个错误
关于如何编写宏以保持正确的数据类型,同时准确定义月份的开始日期和结束日期,有什么建议吗?当我尝试将每个月的开始日期和结束日期更改为相同的格式时,代码其余部分中的某些内容会导致错误,指出它无法使用两个不同格式的变量,即使在它们显然与代码中定义的格式相同
请让我知道,如果有什么我可以澄清,因为这是一个有点难以解释比我的意图
感谢您的帮助。请尝试以下方法来创建宏变量:
data _null_;
START_MTH = '01nov2014'd;
do i = 1 to 6;
T_DATE = intnx('month',START_MTH,i)-1; /*Shift forwards i months then back 1 day*/
call symput(cats('m',i),put(T_DATE,mmyyn4.));
call symput(cats('d',i),cats("'",put(T_DATE,date9.),"'d"));
end;
run;
因此,您基本上是在尝试构建一个可以逐月运行报告的宏。我认为使用宏是一个好主意,但您的结构可以从重新组织中受益 首先要修复的是硬编码的日期。硬编码在99%的情况下是不好的。为什么不使用循环呢 在程序顶部初始化开始日期和结束日期。将来,如果它们位于顶部,则很容易找到和更改它们,并且您无需搜索代码来找出还需要更改的内容:
* PICK ANY DATES IN THE MONTHS YOU WANT TO START AND END. IE. DOESNT MATTER IF YOU CHOOSE THE FIRST OR THE 20TH. IT WILL RUN FOR THAT MONTH;
%let rpt_start = %sysfunc(mdy(11,1,2014));
%let rpt_end = %sysfunc(mdy( 4,1,2015));
转到并获取开始日期和结束日期之间的数据:
proc sql;
create table perf as
select a. field, a. field, a. field, a. reportingdate,
a. field, a. field,
e. field,
f. field
from table a, table2 e, table3 f
where a. reportingdate between &rpt_start and &rpt_end
and (a. field=1 or a. field=1)
and a. field = e. field and a. field = f. field;
quit;
现在,在开始日期和结束日期之间每个月循环一次。在进行过程中创建所需的数据集
%macro create_monthly_datasets;
%local tmp_dt tmp_end rpt_dt;
%let tmp_end = %sysfunc(intnx(month,&rpt_end,0,end)); *CALC END-DATE DESIRED;
%let tmp_dt = %sysfunc(intnx(month,&rpt_start,0,beginning)); *INITIALISE LOOP;
%do %while (&tmp_dt le &tmp_end);
* CALC ACUTAL DATE WANTED AND STORE IT IN RPT_DT;
* CALC THE MMYY VAL YOU NEED;
* PRINT OUT BOTH VALUES TO MAKE SURE THEYRE CORRECT;
%let rpt_dt = %sysfunc(intnx(month,&tmp_dt,0,end));
%let mmyy = %sysfunc(month(&rpt_dt),z2.)%substr(%sysfunc(year(&rpt_dt)),3,2);
%put %sysfunc(sum(&rpt_dt),date9.) &mmyy;
* DO THE WORK;
data m&mmyy (rename=(field=active&mmyy field=co&mmyy field=es&mmyy field=sr&mmyy));
set perf;
where datepart(reportingdate)=&rpt_dt;
run;
proc sort data=m&mmyy; by field descending co&mmyy; run;
proc sort data=m&mmyy nodupkey out=m2&mmyy; by field; run;
%let tmp_dt = %sysfunc(intnx(month,&tmp_dt,1,beginning)); * ITERATE LOOP;
%end;
%mend;
%create_monthly_datasets;
首先,您试图在宏定义中的data语句中重命名
字段
4次。语法是oldname1=newname1 oldname2=newname2…
。进一步的问题-为什么要在proc sql
中的同一个表中多次选择同一字段?是否替换了所有变量名th字段
?如果是,请区分它们以便于调试。我应该补充的是,该代码未经测试。希望我没有任何语法错误。但你应该了解它的要点。赞成以比我更全面的方式处理代码。
%macro create_monthly_datasets;
%local tmp_dt tmp_end rpt_dt;
%let tmp_end = %sysfunc(intnx(month,&rpt_end,0,end)); *CALC END-DATE DESIRED;
%let tmp_dt = %sysfunc(intnx(month,&rpt_start,0,beginning)); *INITIALISE LOOP;
%do %while (&tmp_dt le &tmp_end);
* CALC ACUTAL DATE WANTED AND STORE IT IN RPT_DT;
* CALC THE MMYY VAL YOU NEED;
* PRINT OUT BOTH VALUES TO MAKE SURE THEYRE CORRECT;
%let rpt_dt = %sysfunc(intnx(month,&tmp_dt,0,end));
%let mmyy = %sysfunc(month(&rpt_dt),z2.)%substr(%sysfunc(year(&rpt_dt)),3,2);
%put %sysfunc(sum(&rpt_dt),date9.) &mmyy;
* DO THE WORK;
data m&mmyy (rename=(field=active&mmyy field=co&mmyy field=es&mmyy field=sr&mmyy));
set perf;
where datepart(reportingdate)=&rpt_dt;
run;
proc sort data=m&mmyy; by field descending co&mmyy; run;
proc sort data=m&mmyy nodupkey out=m2&mmyy; by field; run;
%let tmp_dt = %sysfunc(intnx(month,&tmp_dt,1,beginning)); * ITERATE LOOP;
%end;
%mend;
%create_monthly_datasets;