2017-12-03 20 views
0

私は22の変数と345の観測値を持つSASにデータセットを持っています。 CliendID、クラス(不良または不良)、期間、目的、saving_status、および変数を含む変数。SASマクロ - 条件付きで結果を出力

は、私は(観測変数に対応する)は、次のすべての情報を表示する% client_typeマクロを書きたい:クライアントID、期間、目的、顧客は良好な信用を持っているSaving_status場合。顧客が良いクレジットカードでない場合(そのクラスが「悪い」の場合)、「Bad Customer」というメッセージが表示されます。

マクロ%client_statusは、パラメータ(ClientID)としてCliendIDを受け取る必要があります。

私は以下のコードを使用しますが、動作しないため、マクロ(%client_status(11254858))を呼び出すと出力がありません。

%macro status_client(data,ClientID); 
    proc sql; 
    select class from project3.dada_credit where ClientID = &CliendID. as Credit; 
    quit; 

    %let class = Credit; 

    %if &class. = "good" %then %do; 
     proc print data = data_credit; 
     var ClientID duration purpose saving_status; 
     run; 
    %end; 

    %else %do; 
     %put &ClientID. "Is a bad credit customer"; 
    %end; 

%mend status_client; 

どのように修正する必要がありますか?

+0

&クラスはどこから来ますか?あなたのテキストやコードの中では全く言及されていません。 – Reeza

+0

"class"は私のデータセット内の変数であり、これを以下のようにマイクロ変数として定義します。私も自分のデータセットを定義しますが、私はそれについてはわかりません。 %let data = data_set; %let class = class; – Farzad

+0

なぜマクロパラメータリストに含まれていないのですか?それは良いデザインではありません。しかし、それがどこから来るのかも明確ではありません。マクロ変数ではない変数の場合、この方法で値にアクセスすることはできません。ここで何が起こっているのか、あなたが望むものについてもっと詳しく説明する必要があります。 – Reeza

答えて

0

現在のマクロの使用の最大の問題は、あなたがCLIENTIDパラメータの値なしでそれを呼び出しているです。マクロ呼び出しで定位置パラメーターを使用しているので、呼び出しはDATAパラメーターの値を設定し、CLIENTIDは空のままにします。

最初のSQLクエリを使用して%IF /%THEN /%ELSEロジックでテストできるマクロ変数を設定してください。 SQLでマクロ変数を設定するには、INTO句を使用する必要があります。 SQLクエリで一致する観測値が見つからない場合は、マクロ変数を初期化する必要があります。

%macro status_client(ClientID,dsn=project3.data_credit); 
%local credit ; 
%let credit=NOTFOUND; 
proc sql noprint; 
select upcase(class) 
    into :credit trimmed 
    from &dsn 
    where ClientID = &CliendID. 
; 
quit; 

%if (&credit. = GOOD) %then %do; 
proc print data = &dsn ; 
    where ClientID = &CliendID. ; 
    var ClientID duration purpose saving_status; 
run; 
%end; 
%else %if (&credit = NOTFOUND) %then %put Client &clientid not found.; 
%else %put Client &clientid has &credit credit.; 
%mend status_client; 
+0

ReezaとTomは、あなたの親切なアドバイスをいただき、ありがとうございます。私は多くを学ぶ。 – Farzad

0

これはあなたが望むものと思われます。あなたのSQLは間違っているので、まず作業コードから始めてください。

訂正:

  1. これはテキストであるとしてマクロ変数の比較から引用符を削除
  2. を必要とされていない%のLETを削除
  3. マクロ変数のクラスを作成するために、PROCのSQLコードを変更します。比較では大文字と小文字が区別されます。
  4. 結果をクライアントに限定するためのクエリにフィルタを追加します。これは、すべての結果を出力するのは意味がないためです。
  5. データパラメータはマクロで使用されていないため、削除してください。
  6. あなたのマクロ呼び出しが間違っている、client_status対status_client

    %macro status_client(ClientID); 
    proc sql NOPRINT; 
        select class into : class from project3.dada_credit where ClientID=&CliendID.; 
    quit; 
    
    %if &class.=good %then 
        %do; 
    
         proc print data=data_credit; 
          WHERE clientID=&clientID; 
          var ClientID duration purpose saving_status; 
         run; 
    
        %end; 
    %else 
        %do; 
         %put &ClientID. "Is a bad credit customer"; 
        %end; 
    %mend status_client; 
    
    %status_client(11254858);