Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SAS宏变量在PROC SQL中创建变量名_Sql_Sas_Sas Macro - Fatal编程技术网

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

使用SAS宏变量在PROC SQL中创建变量名,sql,sas,sas-macro,Sql,Sas,Sas Macro,我试图根据数据集中的一列字符串创建一组标志。字符串有数千个唯一值,但我只想为一小部分(比如10)创建标志。我想使用SAS宏变量来执行此操作。我尝试过许多不同的方法,但没有一种有效。下面是对我来说最简单、最符合逻辑的代码,尽管它仍然不起作用: %let Px1='12345'; PROC SQL; CREATE TABLE CLAIM1 AS SELECT b.MEMBERID , b.ENROL_MN , CASE WHEN (a.PROCEDURE = &Px1.) THEN

我试图根据数据集中的一列字符串创建一组标志。字符串有数千个唯一值,但我只想为一小部分(比如10)创建标志。我想使用SAS宏变量来执行此操作。我尝试过许多不同的方法,但没有一种有效。下面是对我来说最简单、最符合逻辑的代码,尽管它仍然不起作用:

%let Px1='12345'; 

PROC SQL;

CREATE TABLE CLAIM1 AS
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;

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

8048  , CASE WHEN (PROCEDURE= &Px1.) THEN 1 ELSE 0 END AS CPT_+&Px1.
                                                           -
                                                           78
ERROR 78-322: Expecting a ','.
问题的原因似乎与字符串CPT_u与宏变量的组合有关。正如我提到的,我已经尝试了几种方法来解决这个问题,但都没有奏效


提前感谢你的帮助

这样的东西通常需要动态sql(虽然我不确定如何使用SAS,但我相信这可能取决于您如何与数据库建立连接)


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

%let Px1='12345';
data pxlist;
  input px $10. ;
cards;
12345 
4567
; 
proc sql noprint;
select catx(' ','PROCEDURE=',quote(trim(px)),'as',cats('CPT_',px))
  into :flags separated by ','
  from pxlist
;
%put &=flags;
quit;
现在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.

注意
不是
,因为这样可以解析宏变量。

如果您有一个列表,它可能有助于将列表放入一个表中。然后您可以使用SAS代码生成代码来生成标记变量,而不是宏代码

假设一个带有PX代码变量的表

%let Px1='12345';
data pxlist;
  input px $10. ;
cards;
12345 
4567
; 
proc sql noprint;
select catx(' ','PROCEDURE=',quote(trim(px)),'as',cats('CPT_',px))
  into :flags separated by ','
  from pxlist
;
%put &=flags;
quit;
然后可以使用procsql查询生成代码,将标志变量转换为宏变量

%let Px1='12345';
data pxlist;
  input px $10. ;
cards;
12345 
4567
; 
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

这是TSQL而不是SAS的实现,因此与此无关。SAS完全不同。我还想指出的是,我并不认为这是一种非常好的方式来完成所述任务:根据具体细节,有很多比
SQL
更好的方法。太棒了,乔。这就成功了。谢谢你的帮助。我乐于接受关于更好的方法,您有什么建议吗?@BillW Tom的建议是一个开始,尽管我认为这太取决于您正在尝试做什么。过程转置、一些建模过程或数据步骤可能是更好的解决方案,具体取决于您正在做什么。SQL只是没有围绕这种ta进行真正的优化使用SAS的一个主要好处是,你有很多已经构建好的方法来做这样的事情,基本上你不需要手工来做。