2017-05-05 239 views
0

我試圖根據數據集中一列字符串創建一組標誌。該字符串有成千上萬的唯一值,但我想創建只有一個小子集(比如10)的標誌。我想使用SAS宏變量來做到這一點。我嘗試了許多不同的方法,其中沒有一個能夠奏效。這裏是一個似乎最簡單和最合乎邏輯的我的代碼,但它仍然沒有工作:使用SAS宏變量在PROC中創建變量名稱SQL

%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_與宏變量組合。正如我所提到的,我嘗試了幾種方法來解決這個問題,但都沒有成功。

在此先感謝您的幫助。

回答

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; 
+0

這是TSQL不是SAS的實現,所以這個不相關的。 SAS完全不同。 – Joe

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. 

注意"'爲讓宏變量的決心。

+0

我還會注意到,我不覺得這是一個非常好的方式去完成所述的任務:根據具體的細節,有許多比'SQL'更好的方法。 – Joe

+0

太棒了,喬。這個伎倆。感謝您的幫助。我願意接受任何關於更好的方式去做這件事的建議。 – BillW

+0

@BillW湯姆的建議是一個開始,但我認爲它太依賴於你想要做的事情。 PROC TRANSPOSE,一些建模過程或數據步驟可能是一個更好的解決方案,具體取決於你在做什麼。 SQL並沒有真正圍繞這類任務進行優化,使用SAS的主要好處之一是你有很多已經建好的方法來做這樣的事情,你不必親自去做。 – Joe

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 
+0

這太棒了,謝謝湯姆! – BillW