2017-02-01 2 views
0

sasマクロを作成しています。どちらの列にでも結合しようとしています。それは望んでいるので、これは、エラーが出て、それのように私は何かを与えるときには、両方の列が存在します2つの列のいずれかに条件付きで結合する必要があります(どちらかが存在する場合)

%Macro Base_pop(ssc,input_table,POPN_TBL); 

PROC SQL; 
    CREATE TABLE test_&ssc. AS 
     SELECT B.ACCOUNT_ID 
     FROM ADL_EXT.&input_table.TB INNER JOIN 
      ADL_BSE.BRDM_POP_FLG_&POPN_TBL.B 
      ON B.ACCOUNT_ID = (CASE WHEN %sysfunc(exist(TB.ACCOUNT_ID)) then TB.ACCOUNT_ID 
            ELSE TB.FAC_ID                  
           END) 
     WHERE B.FLG = 'Y' 
     ORDER BY B.ACCOUNT_ID ; 

QUIT; 

%MEND; 

コードエラーを出しTB.Account_idが存在しないと言って。私も合体を試みたが、うまくいかなかった。

マクロに渡されるテーブルには、2つの列のうち1つだけが存在します。 したがって、現在のテーブルに存在する列を動的に結合する必要があります。

お願いします!

+0

1)EXIST()関数は変数ではなく、データセットの存在をテストしています。 (2)マクロを作成したので、%IFロジックを使用して、実行したいSASコードを条件付きで生成することができます。そうすれば、存在しない変数への参照を生成することはできません。あなたの例には、条件付きで生成されたコードはありません。私はCASE文を%IF ..%THEN%ELSE文に置き換えたいと思う。 – Tom

+0

マクロを呼び出すプログラマーに、マクロにどの変数名を使用させるように指示することはできませんか? – Tom

+0

お返事ありがとうTom!マクロは大きく、いくつかのテーブルに存在する可能性のあるさまざまなカラムを使用します。条件付き%if論理が偽の場合でも、コンパイラはなぜ偽条件に従う変数名を探すのですか?この1つの列だけではなく、いくつかのそのような列があり、パラメータの追加を続けたくない場合は、回避策はありません。 – Rhea

答えて

0

問題の説明には、変数の存在をテストしたいが、それを行うためのコードは含まれていません。そのテストを行う1つの方法は、テーブルに関するSASメタデータを照会することです。したがって、以下のこのコードでは、入力データセットで見つけたACCOUNT_IDまたはFAC_IDのいずれかのファーストネームを使用し、それを使用します。見つからない場合は、SASログにエラーメッセージを書き込みます。

%macro base_pop(ssc,input_table,popn_tbl); 
%local out ina inb var ; 
%let out=test_&ssc ; 
%let ina=%upcase(adl_ext.&input_table); 
%let inb=%upcase(adl_bse.brdm_pop_flg_&popn_tbl); 

proc sql noprint ; 
    select name into :var 
    from dictionary.columns 
    where libname = "%scan(&ina,1,.)" 
     and memname="%scan(&ina,2,.)" 
     and upcase(name) in ('ACCOUNT_ID','FAC_ID') 
    ; 
%if (&sqlobs) %then %do; 
    create table &out as 
    select b.account_id 
    from &ina a inner join &inb b 
    on b.account_id = a.&var 
    where b.flg = 'y' 
    order by b.account_id 
    ; 
%end; 
%else %put ERROR: Could not find either ACCOUNT_ID or FAC_ID in &ina ; 

quit; 

%mend base_pop; 
+0

おかげでトム!しかし、私が言及したように、条件付きで存在する列に参加するために、コードにいくつかのチェックがあります。探していないし、それらのすべてのマクロ変数を作成したくない、私はむしろそれらをマクロ変数として渡すだろう。コードをより迅速かつ効率的にする必要があります。 – Rhea

関連する問題