Sas 如何在最终报告(.xlsx文件)中使用过滤器显示动态结果

Sas 如何在最终报告(.xlsx文件)中使用过滤器显示动态结果,sas,report,Sas,Report,我正在编写一份报告(.xlsx文件)。 数据有3列用于销售(sale1、sale2和sale3)。 在最终输出(.xlsx文件)中,我想显示: 各栏之间的合计差额,即sale3栏中的-36(=1008-1044)等,请参见第一张图片 我希望看到最终报告过滤后的结果(过滤器加载为Y),请参见第二张图片- sale3的总计为848(sale2为860,sale1为871),列差异为-12,列百分比变化为(1.40%),最后一行总计差异为-11(=848-860)和-11(=860-871) da

我正在编写一份报告(.xlsx文件)。 数据有3列用于销售(sale1、sale2和sale3)。 在最终输出(.xlsx文件)中,我想显示:

  • 各栏之间的合计差额,即sale3栏中的-36(=1008-1044)等,请参见第一张图片

  • 我希望看到最终报告过滤后的结果(过滤器加载为Y),请参见第二张图片- sale3的总计为848(sale2为860,sale1为871),列差异为-12,列百分比变化为(1.40%),最后一行总计差异为-11(=848-860)和-11(=860-871)

     data sales;
     input area load $ prod : $ sale1 sale2 sale3;
      diff=sale3-sale2;
     datalines;
     1 Y p1   109 117 138 
     1 N p1   23  29  20 
     1 Y p2   78  70  68
     1 N p2   63  19  22 
     2 Y p1   49  36  32 
     2 N p1   50  39  44  
     2 Y p3   138 157 158 
     2 N p3   110 126 107 
     3 Y p2   251 267 259  
     3 N p2   182 184 160 
     ;
     run;
    
     ods excel close;
     ods excel file="/C:/data/t1.xlsx"
       options (sheet_name="tab1" frozen_headers='3' frozen_rowheaders='2'       
                embedded_footnotes='yes' autofilter='1-8'); 
     proc report data=sales  nocenter;    
      column area load prod sale1 sale2 sale3 diff change;
      define area -- diff/ display; 
      define sale1-- diff / analysis sum format=comma12. style(column)= 
             [cellwidth=.5in];
      define change / computed format=percent8.2 '% change' style(column)= 
             [cellwidth=.8in];
    
     compute change;
      change = diff.sum/sale2.sum;
       if change >= 0.1 then call define ("change",'STYLE','STYLE=[color=red 
           fontweight=bold]');
       if change <= -0.1 then call define ("change",'STYLE','STYLE=[color=blue 
           fontweight=bold]');
     endcomp;
    
     rbreak after / summarize style=[background=lightblue font_weight=bold];
     run;
     ods excel close;  
    
    数据销售;
    输入区域加载$prod:$sale1 sale2 sale3;
    diff=sale3-sale2;
    数据线;
    1 Y p1 109 117 138
    1N p1 23 29 20
    1 Y p2 78 70 68
    1北p2 63 19 22
    2 Y p1 49 36 32
    2 N p1 50 39 44
    2 Y p3 138 157 158
    2 N p3 110 126 107
    3 Y p2 251 267 259
    3 N p2 182 184 160
    ;
    跑
    ods excel关闭;
    ods excel文件=“/C:/data/t1.xlsx”
    选项(sheet_name=“tab1”冻结的标题='3'冻结的标题='2'
    嵌入的_脚注='yes'自动筛选='1-8');
    过程报告数据=销售数据中心;
    柱面积荷载产品sale1 sale2 sale3差异变化;
    定义区域——差异/显示;
    定义sale1——差异/分析和格式=comma12。样式(列)=
    [细胞宽度=.5英寸];
    定义更改/计算格式=百分比8.2“%更改”样式(列)=
    [cellwidth=.8in];
    计算变化;
    变更=差异总和/销售额2.总和;
    如果更改>=0.1,则调用define(“更改”,“样式”,“样式=[color=red]
    fontweight=粗体]');
    
    如果更改,则可以通过将
    报告
    计算的硬和替换为通过调用定义样式(将tagattr设置为Excel公式)传递到单元格的公式,从而使报告合计行具有筛选意识

    Excel函数
    小计(9,范围)
    支持筛选,而code
    9
    表示计算总和。Excel
    INDIRECT
    用于计算总行上方的列单元格范围

    例如:

    proc report data=sales  nocenter;
      column area load prod sale1 sale2 sale3 diff change;
      define area -- diff/ display;
      define sale1-- diff / analysis sum format=comma12. style(column)= [cellwidth=.5in];
      define change / computed format=percent8.2 '% change' style(column)= [cellwidth=.8in];
    
      compute change;
        change = diff.sum/sale2.sum;
        if change >=  0.1 then call define ("change",'STYLE','STYLE=[color=red fontweight=bold]');
        if change <= -0.1 then call define ("change",'STYLE','STYLE=[color=blue fontweight=bold]');
      endcomp;
    
      * inject Excel formula into summary cell;
      compute after;
        call define ('sale1.sum', 'style', "style=[tagattr='formula:=SUBTOTAL(9,INDIRECT(CONCATENATE(ADDRESS(2,COLUMN()),"":"",ADDRESS(ROW()-1,COLUMN()))))']");
        call define ('sale2.sum', 'style', "style=[tagattr='formula:=SUBTOTAL(9,INDIRECT(CONCATENATE(ADDRESS(2,COLUMN()),"":"",ADDRESS(ROW()-1,COLUMN()))))']");
        call define ('sale3.sum', 'style', "style=[tagattr='formula:=SUBTOTAL(9,INDIRECT(CONCATENATE(ADDRESS(2,COLUMN()),"":"",ADDRESS(ROW()-1,COLUMN()))))']");
      endcomp;
    
      rbreak after / summarize style=[background=lightblue font_weight=bold];
    
    run;
    
    proc-report-data=sales-nocenter;
    柱面积荷载产品sale1 sale2 sale3差异变化;
    定义区域——差异/显示;
    定义sale1——差异/分析和格式=comma12。样式(列)=[cellwidth=.5in];
    定义更改/计算格式=百分比8.2“%change”样式(列)=[cellwidth=.8in];
    计算变化;
    变更=差异总和/销售额2.总和;
    如果更改>=0.1,则调用define(“更改”,“样式”,“样式=[color=red-fontwweight=bold]”);
    
    如果更改
    ODS,则EXCEL
    目标没有预选自动过滤器的功能或选项。自动筛选项目选择将涉及VBA代码或“黑客”进入.xlsx fliedoes。这意味着SAS无法进行自动筛选?
    ODS EXCEL
    可以在启用自动筛选的情况下输出表格数据。您不能直接通过SAS指定所选的初始项(即应用的筛选器),不能。但是通过VBS进行指定,然后从SAS调用该脚本或沿着这些行调用该脚本是相当简单的。你最近也在communities.sas.com上问过这个问题吗?有人问过,我记不起官方的答案是什么,但很可能是类似的。我没有在其他地方问过这个问题。顺便说一句,我可以做最后一行(sale2列中的-9和sale3列中的-36)——也就是说,总数之间的差额吗?