京公网安备 11010802034615号
经营许可证编号:京B2-20210330
PROC REPORT基础
1 PROC REPORT语法
PROC REPORT data= SAS-data-set options ;
COLUMNS variable_1 …. variable_n;
DEFINE variable_1;
DEFINE variable_2;
. . .
DEFINE variable_n;
COMPUTE blocks
BREAK … ;
RBREAK … ;
RUN;
COLUMNS:指定输出到报表的列
DEFINE:上述列的格式等
COMPUTE:计算模块
BREAK / RBREAK:生成合计,或报表其它类型的格式。
PROC REPORT的选项Options有很多,下面介绍几个常用的:
DATA= 指定做报表的数据集
PROMPT= PROMPT模式
NOWINDOWS= 不输出到结果
REPORT = 指定一个存储的报表来生成新报表
OUTREPT= 指定新路径来存放报表
OUT= 建立新数据集
HEADLINE 在报表变量标题和内容间生成一个水平分隔线
HEADSKIP 在报表变量标题和内容间生成一行空格
2 先生成一个基本的报表
先生成数据:
data mnthly_sales;
length zip $ 5 cty $ 8 var $ 10;
input zip $ cty $ var $ sales;
label zip="Zip Code"
cty="County"
var="Variety"
sales="Monthly Sales";
datalines;
52423 Scott Merlot 186.
52423 Scott Chardonnay 156.61
52423 Scott Zinfandel 35.5
52423 Scott Merlot 55.3
52388 Scott Merlot 122.89
52388 Scott Chardonnay 78.22
52388 Scott Zinfandel 15.4
52200 Adams Merlot 385.51
52200 Adams Chardonnay 246
52200 Adams Zinfandel 151.1
52200 Adams Chardonnay 76.24
52199 Adams Merlot 233.03
52199 Adams Chardonnay 185.22
52199 Adams Zinfandel 95.84
;
run;
Proc Report生成最基本的报表:
proc report data=mnthly_sales
headline headskip ;
title1 "Simple Report";
column cty zip var sales;
define cty / display width=6 'County/Name';
define zip / display;
define var / display;
define sales / display format=6.2 width=10;
run;
这里的define后面的’/’,其后面有很多选项来对变量格式,输出方式等进行设置,其选项如下:
GROUP:分组显示
DISPLAY:一般显示
ANALYSIS:其值用于计算或统计
ORDER:按其值排序显示
ACROSS:交叉显示
COMPUTED:其值在compute块里计算得到
结果:
3 使用order,按指定变量名排序显示
proc report data=mnthly_sales
headline headskip ;
title1 "Simple Report";
column cty zip var sales;
define cty / order width=6 'County/Name';
define zip / display;
define var / display;
define sales / display format=6.2 width=10;
run;
结果:
4 group分组显示
proc report data=mnthly_sales nofs
headline headskip ;
title1 "Simple Report";
column cty zip var sales;
define cty / group width=6 'County/Name';
define zip / group;
define var / group order=freq descending;
define sales / display format=6.2 width=10;
run;
结果:
5 analysis,统计量求和
proc report data=mnthly_sales nofs
headline headskip ;
title1 "Simple Report";
column cty zip sales;
define cty / group width=6 'County/Name';
define zip / group;
define sales / analysis sum format=6.2 width=10;
run;
结果:
6 求多个统计量
proc report data=mnthly_sales nofs
headline headskip ;
title1 "Simple Report";
column cty zip sales sales=mean_sales;
define cty / group width=6 'County/Name';
define zip / group;
define sales / analysis sum format=6.2 width=10 'sum';
define mean_sales / analysis mean format=6.2 width=10 'Mean of/Sales';
run;
结果:
7 如果你想让某变量的每一个值都作为一列,那就要用到across。这里要注意的是,有across选项的var,在column时后面加了一个’,’,从而将其后面的变量的数据直接放到across变量下。。
proc report data=mnthly_sales nofs headline headskip;
title1 "Cross Tab Report (Across Type)";
column cty zip var,sales;
define cty / group width=6 'County/Name';
define zip / group;
define var / across order=freq descending '- Grape Variety -';
define sales / analysis sum format=6.2 width=10 'Revenue';
run;
结果:
这里,变量variety的每一个值都成为了新的列
8 BREAK与RBREAK,对分组后的报表汇总
proc report data=mnthly_sales nofs headline headskip;
title1 "Report with Breaks";
column cty zip var,sales;
define cty / group width=6 'County/Name';
define zip / group;
define var / across order=freq descending '- Grape Variety -';
define sales / analysis sum format=6.2 width=10 'Revenue';
break after cty / ol skip summarize suppress;
rbreak after / dol skip summarize;
run;
结果:
这里说明一下BREAK与RBREAK后面的选项:
OL 汇总上方加一条线
DOL汇总上方加两条线
UL汇总下方加一条线
DUL 汇总下方加两条线
summarize 对每组进行汇总
skip 加入一空白行
suppress 在汇总行不显示组名
9 compute块,计算统计变量,这个以后将专门介绍
proc report data=mnthly_sales nofs headline headskip;
title1 "Report with Row Sums (Computed Type)";
column cty zip var,sales row_sum;
define cty / group width=6 'County/Name';
define zip / group;
define var / across order=freq descending '- Grape Variety -';
define sales / analysis sum format=6.2 width=10 'Revenue';
define row_sum / computed format=comma10.2 'Total';
break after cty / ol skip summarize suppress;
rbreak after / dol skip summarize;
compute row_sum;
row_sum = sum(_C3_,_C4_,_C5_,_C6_,_C7_,_C8_);
endcompute;
run;
结果:
Compute块是以compute开始,endcompute为结尾,可以计算出很多复杂的数据。这里的_C*_表示第几列的变量,例如_C3_表示第三列,_C#_代表最后一行。这里的_C7_和_C8_是多余的,但不影响结果。
10 proc report与ODS,以后会详细介绍。这里用ODS输出report过程结果,方法很简单,就是将上面的report代码放入ods语句之间。
ods listing close;
ods rtf file = ‘c:sugi30.rtf’;
上面的proc report过程代码放在这里就行
ods rtf close;
即:
ods listing close;
ods rtf file = 'c:sugi30.rtf';
proc report data=mnthly_sales nofs headline headskip;
title1 "Report with Row Sums (Computed Type)";
column cty zip var,sales row_sum;
define cty / group width=6 'County/Name';
define zip / group;
define var / across order=freq descending '- Grape Variety -';
define sales / analysis sum format=6.2 width=10 'Revenue';
define row_sum / computed format=comma10.2 'Total';
break after cty / ol skip summarize suppress;
rbreak after / dol skip summarize;
compute row_sum;
row_sum = sum(_C3_,_C4_,_C5_,_C6_,_C7_,_C8_);
endcompute;
run;
ods rtf close;
结果:
11 report设置style,让报表更炫一点。这个以后也会详细介绍
ods listing close;
ods rtf file = 'c:sugi30.rtf';
proc report data=mnthly_sales nofs headline headskip
style(header)={background=lightskyblue foreground=black}
style(column)={background=lightcyan foreground=black};
title1 "Report with Row Sums (Computed Type)";
column cty zip var,sales row_sum;
define cty / group width=6 'County/Name';
define zip / group;
define var / across order=freq descending '- Grape Variety -';
define sales / analysis sum format=6.2 width=10 'Revenue';
define row_sum / computed format=comma10.2 'Total';
break after cty / ol skip summarize suppress;
rbreak after / dol skip summarize;
compute row_sum;
row_sum = sum(_C3_,_C4_,_C5_,_C6_,_C7_,_C8_);
endcompute;
run;
ods rtf close;
结果:
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数据工作的全流程中,数据清洗是最基础、最耗时,同时也是最关键的核心环节,无论后续是做常规数据分析、可视化报表,还是开展 ...
2026-03-20在大数据与数据驱动决策的当下,“数据分析”与“数据挖掘”是高频出现的两个核心概念,也是很多职场人、入门学习者容易混淆的术 ...
2026-03-20在CDA(Certified Data Analyst)数据分析师的全流程工作闭环中,统计制图是连接严谨统计分析与高效业务沟通的关键纽带,更是CDA ...
2026-03-20在MySQL数据库优化中,分区表是处理海量数据的核心手段——通过将大表按分区键(如时间、地域、ID范围)分割为多个独立的小分区 ...
2026-03-19在商业智能与数据可视化领域,同比、环比增长率是分析数据变化趋势的核心指标——同比(YoY)聚焦“长期趋势”,通过当前周期与 ...
2026-03-19在数据分析与建模领域,流传着一句行业共识:“数据决定上限,特征决定下限”。对CDA(Certified Data Analyst)数据分析师而言 ...
2026-03-19机器学习算法工程的核心价值,在于将理论算法转化为可落地、可复用、高可靠的工程化解决方案,解决实际业务中的痛点问题。不同于 ...
2026-03-18在动态系统状态估计与目标跟踪领域,高精度、高鲁棒性的状态感知是机器人导航、自动驾驶、工业控制、目标检测等场景的核心需求。 ...
2026-03-18“垃圾数据进,垃圾结果出”,这是数据分析领域的黄金法则,更是CDA(Certified Data Analyst)数据分析师日常工作中时刻恪守的 ...
2026-03-18在机器学习建模中,决策树模型因其结构直观、易于理解、无需复杂数据预处理等优势,成为分类与回归任务的首选工具之一。而变量重 ...
2026-03-17在数据分析中,卡方检验是一类基于卡方分布的假设检验方法,核心用于分析分类变量之间的关联关系或实际观测分布与理论期望分布的 ...
2026-03-17在数字化转型的浪潮中,企业积累的数据日益庞大且分散——用户数据散落在注册系统、APP日志、客服记录中,订单数据分散在交易平 ...
2026-03-17在数字化时代,数据分析已成为企业决策、业务优化、增长突破的核心支撑,从数据仓库搭建(如维度表与事实表的设计)、数据采集清 ...
2026-03-16在数据仓库建设、数据分析(尤其是用户行为分析、业务指标分析)的实践中,维度表与事实表是两大核心组件,二者相互依存、缺一不 ...
2026-03-16数据是CDA(Certified Data Analyst)数据分析师开展一切工作的核心载体,而数据读取作为数据生命周期的关键环节,是连接原始数 ...
2026-03-16在用户行为分析实践中,很多从业者会陷入一个核心误区:过度关注“当前数据的分析结果”,却忽视了结果的“泛化能力”——即分析 ...
2026-03-13在数字经济时代,用户的每一次点击、浏览、停留、转化,都在传递着真实的需求信号。用户行为分析,本质上是通过收集、整理、挖掘 ...
2026-03-13在金融、零售、互联网等数据密集型行业,量化策略已成为企业挖掘商业价值、提升决策效率、控制经营风险的核心工具。而CDA(Certi ...
2026-03-13在机器学习建模体系中,随机森林作为集成学习的经典算法,凭借高精度、抗过拟合、适配多场景、可解释性强的核心优势,成为分类、 ...
2026-03-12在机器学习建模过程中,“哪些特征对预测结果影响最大?”“如何筛选核心特征、剔除冗余信息?”是从业者最常面临的核心问题。随 ...
2026-03-12