使用SAS宏变量在PROC SQL中创建变量名称

时间:2017-05-05 15:12:34

标签: sql sas sas-macro

我正在尝试根据数据集中的一列字符串创建一组标志。该字符串有数千个唯一值,但我想只为一个小子集(比如10)创建标志。我想使用SAS宏变量来做到这一点。我尝试了很多不同的方法,但没有一种方法有效。这里的代码对我来说似乎最简单和最符合逻辑,尽管它仍然不起作用:

8048  , CASE WHEN (PROCEDURE= &Px1.) THEN 1 ELSE 0 END AS CPT_+&Px1.
                                                           -
                                                           78
ERROR 78-322: Expecting a ','.

显然在这段代码中只有一个标志,但是一旦我弄明白,我就想添加额外的宏变量和标志。这是我收到的错误消息:

{{1}}

似乎问题的原因与将字符串CPT_与宏变量组合有关。正如我所提到的,我已经尝试了几种方法来解决这个问题,但没有一种方法可行。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

这样的事情通常需要动态的sql(虽然我不确定它如何与SAS一起工作,我相信它可能取决于你如何与数据库建立连接)。

Proc sql;

DECLARE @px1 varchar(20) = '12345'
       ,@sql varhcar(max) = 
               'SELECT b.MEMBERID
                     , b.ENROL_MN
                     , CASE WHEN (a.PROCEDURE = ' + @Px1 + ') THEN 1 ELSE 0 
                                  END AS CPT_' + @px1  + '
                     , a.DX1
                     , a.DX2
                     , a.DX3
                     , a.DX4

                   FROM ENROLLMENT as b
                   left join CLAIMS as a
                   on a.MEMBERID = b.MEMBERID'

EXEC sp_excutesql @sql;



QUIT;

答案 1 :(得分:0)

这里的问题是宏变量中的引号。

%let Px1='12345';

现在SAS正在看到这个:

... THEN 1 ELSE 0 END AS CPT_+'12345'

这不合法!您需要删除'

%let Px1 = 12345;

然后在正确的位置添加。

CASE WHEN a.procedure = "&px1." THEN 1 ELSE 0 END AS CPT_&px1.

请注意"而非',因为这样可以解析宏变量。

答案 2 :(得分:0)

如果您有一个列表,将列表放入表格可能会有所帮助。然后,您可以使用SAS代码生成代码以生成标志变量而不是宏代码。

说一个包含PX代码变量的表。

data pxlist;
  input px $10. ;
cards;
12345 
4567
; 

然后,您可以使用PROC SQL查询生成代码,使标志变量成为宏变量。

proc sql noprint;
select catx(' ','PROCEDURE=',quote(trim(px)),'as',cats('CPT_',px))
  into :flags separated by ','
  from pxlist
;
%put &=flags;
quit;

代码看起来像

PROCEDURE= "12345" as CPT_12345,PROCEDURE= "4567" as CPT_4567

所以,如果我们制作一些虚拟数据。

data enrollment ;
  length memberid $8 enrol_mn $6 ;
  input memberid enrol_nm;
cards;
1 201612
;
data claims;
  length memberid $8 procedure $10 dx1-dx4 $10 ;
  input memberid--dx4 ;
cards;
1 12345 1 2 . . . 
1 345 1 2 3 . .
;

然后我们可以组合这两个表并创建标志变量。

proc sql noprint;
create table want as
  select *,&flags
  from ENROLLMENT 
  natural join CLAIMS
;
quit;

结果

memberid procedure dx1 dx2 dx3 dx4 enrol_mn CPT_12345 CPT_4567
1        12345     1   2           201612   1         0
1        345       1   2   3       201612   0         0