【发布时间】:2015-04-17 01:49:05
【问题描述】:
我想编写一个宏来运行附加 10 个查询的结果,我使用 SAS 宏代码生成这些查询。
%MACRO APPENDTEST;
PROC SQL;
%DO I = 1 %TO 12
CREATE TABLE WORK.APPENDTEST AS
SELECT t1.OrderID, t2.Name, t3.Product, t1.Date, t1.Units
FROM DVJAYESH.CANDY_SALES_HISTORY t1,
DVJAYESH.CANDY_PRODUCTS t3,
DVJAYESH.CANDY_CUSTOMERS t2
WHERE (t1.ProdID = t3.ProdID AND t1.Customer = t2.CustID)
AND t1.Date BETWEEN CATS('01', %PUT(CATS(&I), $MTH_NAME.), '2003')D AND
CATS('31', %PUT(CATS(&I), $MTH_NAME.), '2003')D
ORDER BY t1.Date, t2.Name, t3.Product;
%END;
QUIT;
%MEND APPENDTEST;
%APPENDTEST;
我收到多个错误。第一个是-A character operand was found in the %EVAL function or %IF condition where a numeric operand is required.
请解释并纠正。
仅供参考:我对 SAS 编程非常陌生。我使用 SAS 企业指南
【问题讨论】:
-
好的修复了问题 #1,即我在 DO 语句的末尾缺少一个分号。现在的问题是 - 宏关键字 PUT 显示为文本。
-
修复了第二个问题。删除了 PUT 函数的 % 符号。 %PUT 用于将文本或宏变量信息写入 SAS 日志。现在我收到多个错误 - 语法错误,期待以下之一:!!、*、**、+、-、/、AND、||。在 Where 子句的代码中 D 所在的位置。
-
如果您是 SAS 编程新手:不要从宏开始。首先学习 SAS 编程。宏语言不是你应该做大部分工作的地方。 SAS 有更好的工具来完成上述没有宏的事情。
-
不管怎样,上面的问题在这里并不适用。如果您对某事物的工作原理有特定的疑问,请提出问题,但我们不会仅仅对有很多问题的查询进行一般调试。
-
我没有仔细看这个,但是更简单的条件不会是:
year(t1.date)=2003 and month(date)=&I.?此外,您需要将&I放在表名中,否则每次运行时它都会覆盖相同的数据集。