【问题标题】:How to print groupped data in SAS webout file如何在 SAS webout 文件中打印分组数据
【发布时间】:2017-11-30 07:28:58
【问题描述】:

我创建了如下数据集

Custom_Data_Set
Branch | Code | Region | Col_1 | Col_2 | Fee_1 | Fee_2 | Total
 1st      01     East     val     val     150     250     400
 1st      01     East     val     val     100     120     220
 1st      01     East     val     val     130     120     250
 2nd      02     West     val     val     200     250     450
 2nd      02     West     val     val     300     400     700

不,我想将这些数据按组打印到我的网络文件中,例如

Branch: 1st  Code: 01  Region: East
  Col_1 | Col_2 | Fee_1 | Fee_2 | Total
   val     val    150     250     400
   val     val    100     120     220
   val     val    130     120     250

   Total          380     490     870
Branch: 2nd  Code: 02  Region: West
  Col_1 | Col_2 | Fee_1 | Fee_2 | Total
   val     val    200     250     450
   val     val    300     400     700

   Total          500     650    1150

 GrandTotal       880     1140   2020

我可以使用

进行简单的打印
data _null_;
put '<html><body><table>';
run;

data _null_;
 put numberOfObservations=;
 set work.Custom_Data_Set nobs=numberOfObservations;
 file _webout; 
 put '<tr>
         <td>'; put Branch ; put'</td>
         <td>'; put Code ; put'</td>
         <td>'; put Col_1 ; put'</td>
         <td>'; put Col_2 ; put'</td>
         <td>'; put Fee_1 ; put'</td>
         <td>'; put Fee_2 ; put'</td>
         <td>'; put Total; put'</td>
         </tr>';
run;

data _null_;
put '<tr>
         <td>Total</td>
         <td></td>
         <td></td>
         <td></td>
         <td>'; put &Fee_1_total ; put'</td>
         <td>'; put &Fee_2_total ; put'</td>
         <td>'; put &_total; put'</td>
         </tr>
    </table></body></html>';
run;

但我无法打印在与总计和总计分组并仅放置一个分支条目时,对整个组的区域进行编码。

我们可以使用分支和代码进行分组。

PS:Fee_1_total、Fee_2_total 和 _total 是我通过 proc sql 获取到语句并将它们分配为 sum(relevent_column) 的宏变量。

【问题讨论】:

    标签: sql sas sas-macro


    【解决方案1】:

    您可以在一个数据步骤中完成整个操作。无需宏变量或 PROC SQL 摘要代码。只需确保数据按分组变量排序即可。

    您可以使用 DOW 循环为每个 BY 组迭代一次数据步骤。在set 语句上使用_N_=1end= 选项创建的变量来知道何时写开始和结束。使用first.branch 知道何时写入块标题行。您可以自己将总和累加到新的数据集变量中,并在 by 组中的最后一行之后输出总行。

    data _null_;
      file _webout ;
      if _n_=1 then do;
        putlog nobs= comma20. ;
        put
      '<html><body><table>'
        ;
      end;
      do until (last.region) ;
        set have nobs=nobs end=eof;
        by branch code region ;
        if first.region then put
      '<tr><th colspan="5">' Branch= code= region= '</th></tr>'
     /'<tr><th>Col_1</th><th>Col_2</th><th>Fee_1</th><th>Fee_2</th><th>Total</th></tr>'
        ;
        put
      '<tr><td>' col_1 '</td>'
          '<td>' col_2 '</td>'
          '<td>' fee_1 '</td>'
          '<td>' fee_2 '</td>'
          '<td>' total '</td></tr>'
        ;
        sum_1 = sum(sum_1,fee_1);
        sum_2 = sum(sum_2,fee_2);
        sum_t = sum(sum_t,total);
      end;
      put
      '<tr><td colspan="2">Total</td>'
          '<td>' sum_1 '</td>'
          '<td>' sum_2 '</td>'
          '<td>' sum_t '</td></tr>'
       ;
       grand_1+sum_1;
       grand_2+sum_2;
       grand_total+sum_t;
       if eof then put
      '<tr><td colspan="2">GrandTotal</td>'
          '<td>' grand_1 '</td>'
          '<td>' grand_2 '</td>'
          '<td>' grand_total '</td></tr>'
    / '</table></body></html>'
       ;
    run;
    

    我将您发布的数据复制到一个数据步骤中,以创建一些可用于编程的内容。 我将 COL_1 和 COL_2 的值更改为不同的值。

    在 IE 中打开的结果表如下所示。

    【讨论】:

    • 直到 (last.region) ;为什么使用区域?我们也可以使用任何其他列吗(last.Branch)
    • 因为多个分支在一个区域内
    • 非常感谢汤姆。你对我帮助很大。你的代码就像一个魅力。我面临一个小问题,即我的 SAS 9.4 在 do 循环的 end 语句之后没有运行脚本。它不是打印总计行和总计行。对可能的问题有任何想法吗?
    • 您可能需要用您的实际代码和问题发布一个新问题。此答案中的 DO 循环由 LAST.xx 变量控制,该变量是由于循环内的 SET 语句的 BY 语句而创建的。如果您没有 BY 语句或 LAST。变量与 BY 语句中的变量不匹配那你就麻烦了。
    • 我用我的实际代码在 sas 和 sas-macro 下发布了一个新问题
    【解决方案2】:

    引用宏分辨率。

    put "&Fee_1_total";
    

    put 语句需要一个变量或一个带引号的字符串。您发布的代码导致 DATA Step put 语句上下文中的已解析宏变量为数字。

    PROC REPORT 也可以产生相同的输出:

    data have;
    input 
    Branch : $3. Code : Region : $4. Col_1 : $3. Col_2 : $3. Fee_1 Fee_2 Total;
    datalines;
     1st      01     East     val     val     150     250     400
     1st      01     East     val     val     100     120     220
     1st      01     East     val     val     130     120     250
     2nd      02     West     val     val     200     250     450
     2nd      02     West     val     val     300     400     700
    run;
    
    options nocenter;
    
    title;
    proc report data = have;
      by branch code region;
      column col_1 col_2 fee_1 fee_2 total;
      rbreak after / summarize;
    run;
    
    * same with variation in titling;
    title "#byvar1: #byval1 #byvar2: #byval2 #byvar3: #byval3";
    options nobyline;
    proc report data = have;
      by branch code region;
      column col_1 col_2 fee_1 fee_2 total;
      rbreak after / summarize;
      format code z2.;
    run;
    
    options byline;
    

    【讨论】:

    • 如何设置数据等于我的数据表而不是写入输入。
    • 发布的代码包括一个数据步骤,用于将您在问题中作为文本表发布的示例重新创建为 SAS 数据集。如果您想用您的数据尝试这个答案,只需使用proc report 版本之一,并将data= 选项更改为指向您的数据集而不是示例数据集。
    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2013-04-28
    • 1970-01-01
    • 2020-01-31
    相关资源
    最近更新 更多