楼主: FlyUFalcon
1195 2

[debug] proc sql 和 %Marco 的结合程序 [推广有奖]

  • 6关注
  • 43粉丝

教授

18%

还不是VIP/贵宾

-

威望
0
论坛币
2683 个
通用积分
16.0011
学术水平
54 点
热心指数
74 点
信用等级
53 点
经验
34273 点
帖子
1052
精华
0
在线时间
1258 小时
注册时间
2011-8-16
最后登录
2023-11-24

100论坛币
我现在要用proc sql 指令批量处理数据,BAS01,BAS02, BAS03...... BAS85 (可见数据有顺序) 。生成的数据叫out01, out02,out03.....out85。

我现在的指令是正确的,如下
  1. proc sql;
  2. create table  out01  as
  3. select
  4.   h._ric,
  5.   h.date_l_,
  6.   h.rbas,
  7.   h.basdp,
  8.   ( select std(s.rbas)
  9.     from  BAS01 s
  10.     where h.gdate between s.gdate-15 and s.gdate+15) as stddev_rbas
  11. from  BAS01 h;

  12.   ( select mean(s.rbas)
  13.     from  BAS01 s
  14.     where h.gdate between s.gdate-15 and s.gdate+15) as mean_rbas
  15. from  BAS01 h;

  16. quit;
复制代码

但是我这里想用 %Macro 和 %Do 自动处理数据然后生成新的数据, 我的code是:

  1. %macro input_data(inname,outname);
  2. %do i=1 %to 85;

  3. data _null_;
  4. if &i<10 then call symput("k","0"||"&i.");
  5. else if &i>=10  then call symput("k","&i.");
  6. run;

  7. proc sql;
  8. create table  &outname.&k.  as
  9. select
  10.   h._ric,
  11.   h.date_l_,
  12.   h.rbas,
  13.   h.basdp,
  14.   ( select std(s.rbas)
  15.     from  &inname.&k. s
  16.     where h.gdate between s.gdate-15 and s.gdate+15) as stddev_rbas
  17. from  &inname.&k. h;

  18.   ( select mean(s.rbas)
  19.     from  &inname.&k. s
  20.     where h.gdate between s.gdate-15 and s.gdate+15) as mean_rbas
  21. from  &inname.&k. h;

  22. ( select std(s.basdp)
  23.     from  &inname.&k. s
  24.     where h.gdate between s.gdate-15 and s.gdate+15) as stddev_basdp
  25. from  &inname.&k. h;

  26.   ( select mean(s.basdp)
  27.     from  &inname.&k. s
  28.     where h.gdate between s.gdate-15 and s.gdate+15) as mean_basdp
  29. from  &inname.&k. h;

  30. quit;

  31. %end;
  32. %mend;
  33. %input_data(BAS,out);

复制代码


但是这个code 提示 ‘ as’  那里有错误。 在一般情况下,proc sql 里的where, as, from 等指令都会被加深为蓝色, 可是我的code下面这些都是普通的黑色字体。 实在搞不懂那里出错了。

请大神们指教。

最佳答案

Enginx 查看完整内容

%macro input_data(inname,outname); %do i=1 %to 85; data _null_; if &i=10 then call symput("k","&i."); run; proc sql; create table &outname.&k. as select h._ric, h.date_l_, h.rbas, h.basdp, ( select std(s.rbas) from &inname.&k. s where h.gdate between s.gdate-15 and s.gdate+15) as stddev_rbas, ( select mean(s.rbas) from &inname.&k. s wh ...
关键词:proc sql marco debug Marc ARC 程序
沙发
Enginx 发表于 2015-9-25 19:20:02 |只看作者 |坛友微信交流群


%macro input_data(inname,outname);
%do i=1 %to 85;

data _null_;
if &i<10 then call symput("k","0"||"&i.");
else if &i>=10  then call symput("k","&i.");
run;

proc sql;
create table  &outname.&k.  as
select
  h._ric,
  h.date_l_,
  h.rbas,
  h.basdp,
  ( select std(s.rbas)
    from  &inname.&k. s
    where h.gdate between s.gdate-15 and s.gdate+15) as stddev_rbas,
  ( select mean(s.rbas)
    from  &inname.&k. s
    where h.gdate between s.gdate-15 and s.gdate+15) as mean_rbas,
( select std(s.basdp)
    from  &inname.&k. s
    where h.gdate between s.gdate-15 and s.gdate+15) as stddev_basdp,
  ( select mean(s.basdp)
    from  &inname.&k. s
    where h.gdate between s.gdate-15 and s.gdate+15) as mean_basdp
from  &inname.&k. h;

quit;

%end;
%mend;

%input_data(BAS,out);

使用道具

藤椅
zhengbo8 发表于 2015-9-25 19:59:34 |只看作者 |坛友微信交流群
先看看。{:2_26:}

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 10:05