2017-05-05 48 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

これは、SASの実装TSQLではないので、これは関係ありません。 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

Fantastic、Joe。これはトリックでした。ご協力ありがとうございました。私はあなたがこれを行うより良い方法についてあなたが持っている提案を受け入れています。 – BillW

+0

@BillW Tomの提案は始まりですが、私はそれがあなたがやろうとしていることにあまりにも依存していると思います。 PROC TRANSPOSE、モデリングプロクセスのいくつか、またはデータステップは、あなたが行っていることに応じて、より良い解決策になるかもしれません。 SQLは、この種のタスクを中心に実際には最適化されておらず、SASを使用することの大きなメリットの1つは、基本的に手作業で行う必要がない場所で、 – 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 . . 
; 

次に、2つのテーブルを結合してフラグ変数を作成することができます。

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

関連する問題