更新
鉴于使用这种新方法,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 中的每个值运行查询。那有意义吗?
我有几个先前的问题要合并为一个。我得到了一些关于其他人的非常有用的建议,希望这可以将它们联系在一起。
我有以下函数创建一个动态字符串来填充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 字符串。从之前的问题来看,我相信我需要在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 字符串的一部分。我已经在其他答案中尝试了一些前面的例子,但我无法让它工作。我希望这个更具体的问题可以帮助我填补这个缺失的步骤,这样我就可以在未来学习如何去做。