处理报告问题:我正在将一个值选择为变量

时间:2019-02-12 21:45:45

标签: sas

我有一个像这样的宏:

%macro links;
PROC SQL;
CREATE TABLE T_US  AS
    SELECT DISTINCT
    ID_SECON,
    NO_BEN,
    s_an
     FROM rm.BENEF
;
QUIT; 

proc sql;
    select max(input(substr(s_an,1,4),4.)) into :max_sign
    from T_US
;
quit;
%mend links;

然后我使用ODS创建报告:

%macro theRep();

options topmargin=1in bottommargin=1in
        leftmargin=0.25in rightmargin=0.25in
;

ods tagsets.ExcelXP path="&cheminEx." file="&fi" style=seaside
options(autofit_height="yes"
        pagebreaks="yes"
        orientation="portrait"
        papersize="letter"
        WIDTH_POINTS = "12" WIDTH_FUDGE = ".0625"
        absolute_column_width="110,175,180,200"
        );

ods escapechar="^";

%theODS;

ods tagsets.ExcelXP close;
ods listing;
%mend theRep;

%macro theODS;
ods tagsets.ExcelXP 
options(sheet_interval="none"
        sheet_name="thename"
        );

proc report data=T_US nowindows spanrows missing noheader
    style(report)=[frame=box rules=all
        foreground=black Font_face='Times New Roman' font_size=10pt
        background=none]
    style(column)=[Font_face='Times New Roman' font_size=10pt just=left]
;

    col ID_SECON NO_BEN s_an;

    define ID_SECON / group order=data noprint;
    define NO_BEN / style(column)=[verticalalign=top];
    define s_an / style(column)=[verticalalign=top];

    compute before ID_SECON / style=[verticalalign=middle background=#f0f0f                     foreground=blue fontweight=bold font_size=12pt];
    line ID_SECON $25.;
    endcomp ;

    title j=center height=12pt 'The title';
run;

%mend theODS;

该报告显示良好。但是问题是:

即使我在定义部分中没有要求,变量max_sign的值也会显示在报告的末尾。

请,您能帮忙吗?为什么变量wich不在数据集中T_US出现在报告中?

谢谢!

3 个答案:

答案 0 :(得分:3)

SQL :into子句根据语法将选择查询中的值转换为一个或多个宏变量。使用:INTO时,不会自动禁止选择输出。使用NOPRINT选项或RESET NOPRINT;语句(仅SQL)抑制SQL输出。

所以你会想要的

proc sql noprint;
  select max(input(substr(s_an,1,4),4.)) into :max_sign
  from T_US
;

:INTO子句还具有一个TRIMMED选项,当在标题或脚注中使用转移的值并且'default'转移具有前导或尾随空格时,该选项很有用。

into :max_sign TRIMMED

答案 1 :(得分:1)

由于此步骤,可能正在显示max_sign的值:

proc sql;
    select max(input(substr(s_an,1,4),4.)) into :max_sign
    from T_US
;
quit;

不是PROC REPORT。尝试添加NOPRINT选项以禁止来自PROC SQL的输出:

proc sql NOPRINT;
    select max(input(substr(s_an,1,4),4.)) into :max_sign
    from T_US
;
quit;

答案 2 :(得分:0)

正如其他人指出的那样,诀窍在于使用into :(some name)noprint。另外,您应该知道宏变量本质上是一个字符串。为什么这有关系?如果将数字存储在宏变量中,则数字将按您输入的数字逐位存储。因此,强烈建议在将数字分配给宏变量之前对其进行格式化。

换句话说,如果真实值为2.36581并将其格式化为2.4并将其分配给宏变量,则无法获得更高的精度。宏变量中存储的全部是“两个,句号,四个”。