如何在 SAS webout 文件中打印分组数据
How to print groupped data in SAS webout file
我创建了一个数据集如下
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).
引用宏解析。
put "&Fee_1_total";
put 语句需要变量或带引号的字符串。您发布的代码导致 DATA Step put 语句上下文中已解析的宏变量成为数字。
PROC REPORT 也可以产生相同的输出:
data have;
input
Branch : . Code : Region : . Col_1 : . Col_2 : . 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;
您可以在一个数据步骤中完成所有操作。不需要宏变量或 PROC SQL 摘要代码。只需确保数据按分组变量排序即可。
您可以使用 DOW 循环为每个 BY 组迭代一次数据步骤。在 set
语句中使用 _N_=1
和由 end=
选项创建的变量来知道何时写入开始和结束。使用 first.branch
知道何时写入块 header 行。您可以自己将总和累加到新的数据集变量中,并在 by group 中的最后一行之后输出总行。
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 的值更改为不同的值。
结果 table 在 IE 中打开时看起来像这样。
我创建了一个数据集如下
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).
引用宏解析。
put "&Fee_1_total";
put 语句需要变量或带引号的字符串。您发布的代码导致 DATA Step put 语句上下文中已解析的宏变量成为数字。
PROC REPORT 也可以产生相同的输出:
data have;
input
Branch : . Code : Region : . Col_1 : . Col_2 : . 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;
您可以在一个数据步骤中完成所有操作。不需要宏变量或 PROC SQL 摘要代码。只需确保数据按分组变量排序即可。
您可以使用 DOW 循环为每个 BY 组迭代一次数据步骤。在 set
语句中使用 _N_=1
和由 end=
选项创建的变量来知道何时写入开始和结束。使用 first.branch
知道何时写入块 header 行。您可以自己将总和累加到新的数据集变量中,并在 by group 中的最后一行之后输出总行。
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 的值更改为不同的值。
结果 table 在 IE 中打开时看起来像这样。