2

これは、進行状況を反映した編集です。

私は動作する次の機能を持っています:

proc fcmp outlib=mydir;
 function sqlWhere(interval $, myDate $) $;
 ...
 return("id");
 endsub;
quit;

これはテスト済みで、正常に動作します。だから私は試しました:

%macro sqlWhere(interval, myDate);
  &interval.("year") AS t
  &myDate.("someDateField") AS tt
%mend;
proc sql;
  CREATE TABLE test AS (
    SELECT %sqlWhere(t, tt)
    FROM myTable);
quit;

選択を実行すると、上部が正常に実行されます。ただし、proc sql が異常終了し、コンマが足りないと表示されます。コードが機能するはずの他のテストで関数が「 id 」を返すため、私は混乱しています。エラーは、「tt」部分にカンマが欠落していることを示しています...

SAS で動的クエリを作成しようとしています。いくつかの問題があり、やりたいことが可能かどうかわかりません。また、以前の質問を削除して申し訳ありません。もっといい説明が欲しかった。

このコードがあるとします:

proc sql;
SELECT 
  YEAR(myDate) AS yr, 
  MONTH(myDate) AS mo,
  id
FROM
  myTable;
run;

私はそれを条件付きにしようとしています。これにより、2 つの問題が生じます。まず、基本的な構文を機能させることができません。次に、カスタム関数で適切な文字列を作成できません。

私はこのようなものが欲しい:

%let a = sqlDate("month");
proc sql;
SELECT
  &a
FROM
  myTable;
run;

この構造は、関数を忘れて入力しても機能しません

%let a = "YEAR(myDate) AS yr, MONTH(myMonth) AS mo, id";

このようなことは可能ですか?

私の2番目の問題は、関数自体を構築する方法ですが、最初にこのようなことさえできることを確認したいと思います. 私は基本的に、「日」、「週」、「月」、または「年」のいずれかであるマスタープログラムにインジケーターを配置し、プログラムに特定の方法でSQLを照会するように指示しています。何とか文字列全体を渡すことはできますか? この方法で入力に基づいて文字列を作成することは可能ですか?

4

1 に答える 1

5

最初の問題は、SAS マクロの誤解によって説明されます。これを置くと:

%let a = "YEAR(myDate) AS yr, MONTH(myMonth) AS mo, id";

SAS はクエリに次のように入力します。

"YEAR(myDate) AS yr, MONTH(myMonth) AS mo, id"

つまり、引用符を保持します。関数などを SAS マクロ変数に入れるときに「隠し」たい場合は、" または ' の代わりに %str() 関数を使用する必要があります。

%str(YEAR(myDate) AS yr, MONTH(myMonth) AS mo, id);

あなたはうまくいく何かを持っているでしょう。

2 番目の質問に答えるには、それは確かに可能です。ただし、非常に重要な点に注意してください。オープン コード内のマクロ関数、マクロ変数の定義、またはマクロ変数の呼び出しは、SAS コードが実行される前に解釈され、置き換えられます。SAS データ ステップまたはプロシージャからの結果に依存するマクロ変数/関数がある場合は、それをマクロ関数にカプセル化する必要があります。その中のすべては実行時にのみ解釈され、置き換えられます。

編集 あなたのコメントに答えるために:あなたがSASマクロに慣れていないように見えるので、それは主に私が伝えている一般的なアドバイスです。場合によっては、マクロ変数が設定/変更されていないように見える奇妙な結果が得られることがあります。それを認識していないと、イライラする可能性があります。(そして、私たちは皆初めてそれに遭遇しました;))

特定のケースで、適切な選択部分を返す sqldate マクロを作成したと仮定した場合、それをクエリにすぐに配置することをお勧めします。例えば:

%macro sqldate(period);
    &period.(mydate) as period
%mend;
/*note no semicolon, since a macro function is basically the same as saying: resolve this piece of macro code and add the result directly to my written code.*/

proc sql;
    select %sqldate(month)
    from mytable;
quit;
/*also note: you end proc sql with a quit statement instead of run*/
于 2013-07-12T22:03:54.083 に答える