【问题标题】:macro variable in where statementwhere 语句中的宏变量
【发布时间】:2012-06-10 12:47:13
【问题描述】:

我有 10 年的数据,需要为某些变量计算 where variable=. 的数量和 where variable=1 的数量。每年都有一些共同变量和一些不同变量。以下代码在 where 语句中存在问题。 这是错误消息,在此先感谢您的帮助。

*ERROR 22-322:语法错误,需要以下之一:名称、带引号的字符串、数字常量、日期时间常量、 缺失值,(, , +, -, ALL, ANY, BTRIM, CALCULATED, CASE, INPUT, PUT, SELECT, SOME, SUBSTRING, TRANSLATE, 用户。

这是所有数据集:

Year   N_community
2000    15339
2001    15246
2002    15142
2003    14916
2004    14500
2005    14701
2006    14732
2007    14804
2008    13651
2009    13751

以下是代码:

/* For year 2000 to 2009 and the number of "missing" */
data health_status_vars_missing;
   set all;
run;
%let CmList = D_CFAIL D_CHD D_CHOLES D_DEPRSS D_HBP D_MYOCAR D_OTHHRT  D_PSYCHO;
%let CmCnt  = %sysfunc(countw(&CmList));
%macro countm(yr);
%do i=0 %to &yr.;
%do L=1 %to &CmCnt.;
    proc sql;
      create table %scan(&Cmlist., &L.)_M as 
      select 200&i as year, count(*) as %scan(&Cmlist., &L.)_M
      from cohort0&i.
      where %scan(&Cmlist., &L.)=.;
    quit;
    data health_status_vars_missing;
       merge health_status_vars_missing(in=a) %scan(&Cmlist., &L.)_M(in=b);
       by year;
       if a;
    run;
%end;
%end;
%mend countm;
%countm(9);

【问题讨论】:

  • 请使用选项 MPRINT SPOOL 获取完整的错误消息。

标签: sas


【解决方案1】:

要解决这个问题,首先需要做的是删除所有宏代码。然后使代码与文字一起工作。复制代码以模拟宏代码将执行的操作。一旦你有了一个可行的解决方案,就把宏代码一块一块地放回去。使用 %PUT 语句确保宏变量正确解析。

如果您需要进一步的帮助,请发布足够的示例数据以允许某人运行代码并查看错误...正如发布的那样,我认为这是不可能的

【讨论】:

    【解决方案2】:

    如果您的程序与发布的完全一致,则问题可能出在以下语句:

    **where %scan(&Cmlist., &L.)=.;**
    

    您可能打算注释掉该行。即便如此,在这种情况下,您还是缺少一个分号来结束您的 SELECT 语句; “退出”这个词;将作为 SELECT 的一部分执行。

    【讨论】:

    • 对不起,where 语句不是命令输出。只是想突出显示这是确切的代码:{where %scan(&Cmlist., &L.)=.;}。实际上,错误信息来自这个 where 语句。
    【解决方案3】:

    使用

    %unquote(where %scan(&Cmlist., &L.))=.;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2014-04-11
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      相关资源
      最近更新 更多