簡體   English   中英

使用SAS宏變量在PROC SQL中創建變量名稱

[英]Use SAS macro variable to create variable name in PROC SQL

我正在嘗試根據數據集中的一列字符串創建一組標志。 該字符串具有數千個唯一值,但我只想為一小部分子集(例如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_與宏變量組合在一起有關。 正如我提到的,我已經嘗試了幾種方法來解決此問題,但是沒有一種方法可行。

在此先感謝您的幫助。

像這樣的事情通常需要動態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;

您的問題是宏變量中的引號。

%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.

注意" not '因為這樣可以使宏變量解析。

如果有列表,將列表放入表可能會有所幫助。 然后,您可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM