第四讲 实用SAS语句精讲

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Case…end
• • • • • • • • • • • proc sql; create table list as select *,input(stkcd,12.) as stock, case when exchflg="1" then "上交所" when exchflg="2" then "深交所" else "交叉上市" end as exchflg2 • Case表达式可以设定带有逻辑条 件的语句; from resdat.lstkinfo; • 可用于任何可以使用列名的地方; quit;
右外部连接
• • • • • • proc sql; create table m19 as select m12.donate,ret1.stock,ret1.year,ret1.ret from m12 right join ret1 on m12.stock=ret1.stock and m12.year=ret1.year; quit;
Put语句:把满足条件的观测显示在 日志窗口中。
简单do语句
以上简单do语句与下面的if语句效果一样,但if语句效率较低:
• If age>14 then hcm=30.5*height/12; • If age>14 then put name= sex= age= hcm=;
循环do语句
DO组中的语句需要被重复执行时要用到循环DO语句。 循环DO语句根据下标变量重复执行DO和END语句之间的语句。 语句格式 DO i=x1 to x2 by x3; [一些SAS语句]; END;
第四讲:实用SAS语句精讲
主要教学内容: SAS函数 proc sql语句
do语句
array语句 retain语句
常见SAS函数
• data m14;set m12; • nobs=_n_; /*_n_表示生成观测序列*/ • keep nobs size asset mv; • run; • data m15;set m14; • data1=nobs**2;/*乘方用**表示*/ • data2=int(size);/*int:取整*/ • data3=ceil(size);/*返回大于等于变量的最小整数值*/ • data4=floor(size);/*返回小于等于变量的最大整数值*/ • data5=sqrt(data1);/*平方根*/ 2 • run;
常见SAS函数
• data m16;set m15; • data6=exp(nobs-1);/*e的x次方*/ • data7=log10(asset);/*以10为底的对数*/ • data8=round(size,0.01);/*保留2位小数后的四舍五入结果*/ • data9=mod(nobs,2);/*求前者除以后者的余数*/ • data10=sign(log(mv)-log(asset));/*符号函数,对正数返回 1,0返回0,负数返回-1*/ • data11=max(log(mv),log(asset)); • data12=min(log(mv),log(asset)); • run;
• Case表达式必须以end结束。
在proc sql中使用统计函数
• • • • • • • • • • • • • proc sql; create table ret2 as select *,avg(ret) as avgret, max(ret) as maxret, std(ret) as stdret, sum(ret) as sumret, var(ret) as varret, n(ret) as nret, nmiss(ret) as nmiss, range(ret) as range from ret1 group by stock; quit; • • • • • • • • Avg\mean:求均值 Max\min:最大值\最小值 Std\var:标准差\方差 Sum:求和 n\count:计数 Nmiss:缺失值个数 Range:取值范围 Group by语句:进行分组汇总, 统计函数作用于分组后的数据。
简单do语句
语句格式: DO; [一些SAS语句] END; 例:IF/THEN语句用中DO. data a1; set resdat.class; if age>14 then do; hcm=30.5*height/12; put name= sex= age= hcm=; end; run;
Select子句
• • • • • • • • • • • proc sql; create table ret as select yrret+0 as ret, input(stkcd,12.) as stock, year(date) as year format 4., month(date) as month format 2. from resdat.yrret; quit;
完全外部连接(生成并集)
• 以下两段程序效果相同: • • • • • • proc sql; create table m20 as select m12.donate,ret1.stock,ret1.year,ret1.ret from m12 full join ret1 on m12.stock=ret1.stock and m12.year=ret1.year; quit;
数据查询 数据操作语 言DML
SELECT INSERT
数据更新
UPDATE DELETE
数据控制语言DCL
GRANT REVOKE
SAS的sql过程
继承了标准SQL语句及其功能 继承了DATA选项、函数、INFORMAT、FORMAT和通用的SAS语句 PROC SQL与其他SAS过程的一些区别: SELECT语句在检索数据的同时会在输出窗口输出数据,使用NOPRINT 选项可以阻止该项输出。 PROC SQL持续运行直至遇到QUIT语句、DATA步或其它SAS过程。因 此,不用在每个SQL语句前重复书写“PROC SQL”。 RUN语句在PROC SQL中不起作用。
ຫໍສະໝຸດ Baidu
• Union 算符合并两个查询的结果, 显示两个查询中所有重复(union all)及非重复的观测(生成并 集)。
Do 语句
DO语句必须由一个END语句来结束。 DO和END语句之间的这些语句称为一个DO组。 DO组可以嵌套任意次。
主要的DO语句: 简单DO语句; 循环DO语句; do over语句;

Where子句中常用的算符
• 比较算符: = • 逻辑算符
^= > >= < <=
and:前后两个条件都满足 or:前后两个条件满足其一 not:后面的条件为假
• 条件算符
between …and:数据在二者之间 where size between 16 and 24; contains:数据包含某字符串 where industry contains “C”; in:数据属于某一范围 where ind in („B‟,‟C‟,‟I‟); is null/ is missing:数据缺失 where donate is missing; like:数据满足某一样式 where industry like „I%‟; =*:完全等于 where name =* “Emily Clake”; exists: 数据是某查询的结果 where exists(select * from tablel2);
Proc sql语句
SQL英文全称是Structured Query Language,即“结构化查询语言” SQL是关系数据库操作的国际标准语言
分类 语句 CREATE 功能 创建表数据库对象
数据定义语言DDL
ALTER DROP
修改数据库对象 删除数据库对象
查询数据 插入数据 更新数据 删除数据 授权 取消授权
• proc sql; • select stock,nobs from issue1 • intersect • select stock,nobs from issue2; • quit; • Intersect算符返回两个查询中公共部 分。
Proc sql用于纵向连接
• • • • • proc sql; select stock,nobs from issue1 except select stock,nobs from issue2; quit;
Where 和 order by 子句
• • • • • • proc sql; create table ret1 as select * from ret where month=12 order by stock,year desc; quit;
• Where:选择观测行。可以用 select子句中出现或者未出现的 变量来作为选择依据。 Order by:排序。默认升序排列, 也可以在变量名后加 desc 变为 降序排列。
• proc sort data=m12;by stock year;run; • proc sort data=ret1;by stock year;run; • data m20;merge ret1 m12;by stock year;run;
Proc sql用于纵向连接
• data issue1;set resdat.issue1;run; • data issue2;set resdat.issue2;run;
• • •
proc sql; create table ret as select distinct
Select:选择列。该子句中用 * 表示所用列; 可以计算生成新列,用as来命名, 用format来规定格式; 用distinct删除重复观测。
• •
input(stkcd,12.) as stock, month(date) as month format 2. • from resdat.yrret; • quit;
• Except算符生成只属于第一个查询 的观测值,将两个查询中公共部分 从第一个查询中剔除。 • 若更换以上程序中issue1和issue2的 位置,则生成的查询为右图:
Proc sql用于纵向连接
• • • • • proc sql; select stock,nobs from issue1 Union select stock,nobs from issue2; quit;
Proc sql用于横向连接
• 内部连接(where \ inner join)
• 左外部连接(Left join)
• 右外部连接(Right join)
• 完全外部连接(full join,效果同merge)
内部连接
• • • • • • • • • • • • • 以下两段程序效果相同: proc sql; create table m17 as select m12.donate,m12.stock,m12.year,ret1.ret from m12, ret1 where m12.stock=ret1.stock and m12.year=ret1.year; quit; proc sql; create table m17 as select m12.donate,m12.stock,m12.year,ret1.ret from m12 inner join ret1 on m12.stock=ret1.stock and m12.year=ret1.year; quit;
左外部连接
• • • • • • proc sql; create table m18 as select m12.donate,m12.stock,m12.year,ret1.ret from m12 left join ret1 on m12.stock=ret1.stock and m12.year=ret1.year; quit;
相关文档
最新文档