アップデート
この新しいアプローチをINTNX
使用すると、ループを使用してさらに単純化できると思います。配列を作成した場合:
data;
array period [4] $ var1-var4 ('day' 'week' 'month' 'year');
run;
そして、各要素のループを作成しようとしました:
%MACRO sqlloop;
proc sql;
%DO k = 1 %TO dim(period); /* in case i decide to drop something from array later */
%LET bucket = &period(k)
CREATE TABLE output.t_&bucket AS (
SELECT INTX( "&bucket.", date_field, O, 'E') AS test FROM table);
%END
quit;
%MEND
%sqlloop
これはうまくいきませんが、私が望むアイデアを捉えています。INTX の各値に対してクエリを実行するだけです。それは理にかなっていますか?
以前の質問がいくつかあり、それらを 1 つにまとめます。他の人たちについて本当に役立つアドバイスをいくつかもらいました。うまくいけば、これがそれらを結び付けることができます.
SELECT
SASproc sql;
コードブロックにステートメントを入力するために動的文字列を作成する次の関数があります。
proc fcmp outlib = output.funcs.test;
function sqlSelectByDateRange(interval $, date_field $) $;
day = date_field||" AS day, ";
week = "WEEK("||date_field||") AS week, ";
month = "MONTH("||date_field||") AS month, ";
year = "YEAR("||date_field||") AS year, ";
IF interval = "week" THEN
do;
day = '';
end;
IF interval = "month" THEN
do;
day = '';
week = '';
end;
IF interval = "year" THEN
do;
day = '';
week = '';
month = '';
end;
where_string = day||week||month||year;
return(where_string);
endsub;
quit;
これにより、必要な種類の文字列が作成されることを確認しました。
data _null_;
q = sqlSelectByDateRange('month', 'myDateColumn');
put q =;
run;
これにより、次の結果が得られます。
q=MONTH(myDateColumn) AS month, YEAR(myDateColumn) AS year,
これはまさに私が SQL 文字列にしたいことです。以前の質問から、この関数を a で呼び出す必要があると思いますMACRO
。次に、次のようなものが必要です。
%MACRO sqlSelectByDateRange(interval, date_field);
/* Code I can't figure out */
%MEND
PROC SQL;
CREATE TABLE output.t AS (
SELECT
%sqlSelectByDateRange('month', 'myDateColumn')
FROM
output.myTable
);
QUIT;
コードでこのマクロを呼び出し、SQL SELECT 文字列の一部として解釈する方法がわかりません。他の回答で前の例のいくつかを試しましたが、うまくいきません。このより具体的な質問が、この欠けているステップを埋めるのに役立ち、将来それを行う方法を学ぶことができることを願っています.