1、第第10章章 过程步通用语句过程步通用语句清华大学经管学院清华大学经管学院 朱世武朱世武ZResdat样本数据:样本数据:SAS论坛:论坛: 过程步通用语句可以分为两类:过程信息语句;变量属性语句。 PROC 语句语句 PROC语句用于规定将要运行的SAS过程。SAS过程是已经写好的SAS程序。例10.1PROC调用打印输出过程PRINT。procprintdata=ResDat.class;varnameageheight;bysex;run;例中,打印数据集ResDat.CLASS中变量NAME,AGE和HEIGHT的观测值,并以性别SEX分类。 -Sex=F-ObsNameAgeHeig
2、ht1Alice1356.52Barbara1365.33Carol1462.84Jane1259.85Janet1562.56Joyce1151.37Judy1464.38Louise1256.39Mary1566.5-Sex=M-ObsNameAgeHeight10Alfred1469.011Henry1463.512James1257.313Jeffrey1362.514John1259.015Philip1672.016Robert1264.817Ronald1567.018Thomas1157.519William1566.5语句格式语句格式 PROCprogram;其中: prog
3、ram规定要运行SAS的过程; options规定过程的选项。OPTIONS选项说明: 通用选项; 过程特定选项。通用选项: Keyword规定过程要求的关键词Keyword=Value规定关键词的值Keyword=SAS-Data-Set 规定输入或输出的SAS数据集应用举例应用举例 例10.2打印列表过程。procprintdata=ResDat.Idx000001(obs=10);run;例中,在OUTPUT窗口打印输出ResDat.Idx000001的前10观测。例10.3求均值过程。procmeansdata=ResDat.Idx000001maxdec=3 css;varclpr;
4、run;例中,在OUTPUT窗口输出变量CLPR的校正平方和(CSS),输出结果保留3位小数。例10.4作图过程选项。procplothpct=50vpct=33;例中,规定按横竖50:33的比例作图。VAR语句语句 VAR语句规定要分析的变量名。语句格式:VARvariables;其中:variables规定要分析的变量。例10.5应用举例。procmeansdata=ResDat.class;varweightheight;run;MEANS过程变量N均值标准偏差最小值最大值-Weight19100.026315822.773933550.5000000150.0000000Height1
5、962.33684215.127075251.300000072.0000000-MODEL语句语句 MODEL语句规定过程需要的统计模型。语句格式:MODELdependents=indepndenteffects/;其中:v dependents规定模型中的因变量;vindepndenteffects规定模型中的自变量;voptions不同过程的特定选项。 例10.6模型设定。modely=x1-x5;modely1y2=abcd;例10.7回归分析过程模型设定。procregdata=ResDat.class;modelheight=weight/dwspec;outputout=out
6、1r=rp=pl95=lu95=u;run;ID语句语句 ID语句规定用于识别观测的变量。语句格式:IDvariables;其中:variables规定用于识别观测的变量。例10.8规定替代观测序号的变量。procprintdata=ResDat.class;idname;run;例中,打印列表输出数据集CLASS时,用变量NAME的值来识别观测。 例10.9规定数据集转置后的观测值识别变量。proctransposedata=ResDat.classout=alet;idname;run;proctransposedata=ResDat.classout=alet;idsex;run;运用上
7、述程序段,查看输出结果。 WHERE 语句语句 WHERE语句选择SAS数据集中的观测。语句格式:WHEREwhere-expression;用法和DATA步中的用法类似。WHERE选项与其它选项的生效顺序: 选项FIRSTOBS=和OBS=; WHERE选项; 创建BY组。例10.10选择观测值。procprintdata=ResDat.class;wheresex=M;run;例10.11删除观测值。procprintdata=ResDat.class;wheresex=M;run;CLASS 语句语句 CLASS语句规定分类变量,SAS过程对分类变量的不同值分别进行分析处理。语句格式:C
8、LASS /CLASSESvariables;其中:variables规定分析数据集中的分类变量。 例10.12应用CLASS语句。procmeansdata=ResDat.class;varweightheight;classsex;outputout=amean=w_mh_m;run;OUTPUT窗口输出:SexObsVariableNMeanStdDevMinimumMaximum-F9Weight990.111111119.383913750.5000000112.5000000Height960.58888895.018327551.300000066.5000000M10Weigh
9、t10108.950000022.727186483.0000000150.0000000Height1063.91000004.937937057.300000072.0000000-例10.13应用BY语句。procmeansdata=ResDat.class;varweightheight;bysex;outputout=bmean=w_mh_m;run;OUTPUT窗口输出:-Sex=F-VariableNMeanStdDevMinimumMaximum-Weight990.111111119.383913750.5000000112.5000000Height960.58888895
10、.018327551.300000066.5000000-Sex=M-VariableNMeanStdDevMinimumMaximum-Weight10108.950000022.727186483.0000000150.0000000Height1063.91000004.937937057.300000072.0000000-BY 语句语句 BY语句规定分组处理变量。使用BY语句时,数据集必须先按BY变量排序。语句格式:BYvariable-list;其中:variable-list规定变量列表。 例10.14按BY组分开打印输出。procprintdata=ResDat.class;b
11、ysex;run;procmeansdata=ResDat.class;bysex;varweight;run;OUTPUT语句语句 OUTPUT语句规定过程产生的输出数据集。语句格式:OUTPUT;其中: sas-data-set规定输出的数据集; keyword=names规定输出数据集中与关键词相联系的输出变量名。例10.15应用举例。procmeansdata=ResDat.class;varheightweight;outputout=out_mmean=h_mw_m;run;例中,过程MEANS计算变量HEIGHT和WEIGHT的均值统计量。关键词MEAN=规定输出数据集OUT_M
12、中的变量为H_M和W_M。H_M和W_M分别表示变量HEIGHT和WEIGHT的均值。 QUIT语句语句 QUIT语句用来结束一个交互式过程。语句用来结束一个交互式过程。语句格式:QUIT; 例10.16应用举例。procgplotdata=ResDat.stk000002;plotclpr*date;titleFirstPlot;run;plotoppr*date;titleSecondPlot;run;quit;FORMAT 语句语句FORMAT语句规定变量的输出格式。语句格式与DATA步中的格式相同。应用FORMAT语句的规则:PPROC步中的输出格式只在PROC过程中有效,原来的输出格
13、式仍保留在数据集中; 同时使用几个FORMAT语句时,最后一个FORMAT语句有效。FORMAT语句可以使用的输出格式:SAS系统的输出格式;PROCFORMAT过程自定义的输出格式;例10.17引用PROCFORMAT过程定义的输出格式。procformat;value$sexfmtM=maleF=female;procprintdata=ResDat.class;varnamesex;formatsex$sexfmt.;run;例中,用PROCFORMAT过程定义的输出格式SEXMFT.来规定变量SEX的输出格式。 ObsNameSex1Alicefemale2Barbarafemale3
14、Carolfemale4Janefemale5Janetfemale6Joycefemale7Judyfemale8Louisefemale9Maryfemale10Alfredmale11Henrymale12Jamesmale例10.18规定变量的输出格式。procprintdata=ResDat.stk000002(obs=10);vardate;formatdateyymmdd10.;run;procprintdata=ResDat.stk000002(obs=10);vardate;formatdatedate7.;run;procprintdata=ResDat.stk000002
15、(obs=10);vardate;formatdate8.;run;ATTRIB语句语句ATTRIB语句规定变量的属性。语句格式与DATA步中的格式相同。ATTRIB语句规定属性在PROC步中以及由该过程产生的输出数据集中有效。例10.19可参考的例句。attribxyzlength=$4label=samplevariables;attribholidayinformat=mmddyy.format=worddate.;attribday1-day7label=dayofweekweek1-week4label=weekofmonthsaleinformat=comma8.2format=d
16、ollar10.label=totalsale;LABEL语句语句 LABEL语句规定变量的标签。语句格式与DATA步中的格式相同。LABEL语句可以出现在PROC过程的任意地方,并只在该过程中有效。例10.20输出图形时坐标轴使用变量标签。procgplotdata=ResDat.stk000002;plotclpr*date;labelclpr=收盘价date=日期;run;第第20章章 SQL从单个表中检索数据从单个表中检索数据清华大学经管学院清华大学经管学院 朱世武朱世武ZResdat样本数据:样本数据:SAS论坛:论坛: SELECT语句综述语句综述 SELECT语句是PROC SQ
17、L的主要工具。使用SELECT语句可以识别、检索和操作表中的数据,使用SELECT子句可以设定查询条件。SELECT语句格式语句格式 SELECT object-item INTO macro-variable-specification FROM from-list GROUP BY group-by-item ORDER BY order-by-item ;SELECT 子句子句 语句格式语句格式SELECT object-item FROM from-list选择所有列选择所有列 语句格式:COLUMN-NAME= * (asterisk) select * from from-list
18、SELECT子句中,“*”号表示选择表中的所有列。例:例:proc sql outobs=3; select * from ResDat.dret;选择特定列选择特定列 语句格式:Select column-name from from-list例例20.120.1选择特定列。proc sqloutobs=3;title股票代码;selectstkcdfromresdat.lstkinfo;procsqloutobs=3;title股票代码和名称;selectstkcd,lstknmfromresdat.lstkinfo;quit;用用DISTINCT语句剔除查询结果中重复观测语句剔除查询结果
19、中重复观测 语句格式:=distinct例例20.2删除重复观测。proc sql;selectdistinctstkcdfromResDat.yrret;quit;创建说明列创建说明列 语句格式:SELECT TEXT, COLUMN-NAME例20.4创建说明列。procsqloutobs=3;selectStockCodefor,lstknm,is,stkcdfromResDat.lstkinfo;quit;输出窗口结果:最新股票名称|LatestStock股票代码|StoNameckCode-StockCodeforS深发展Ais000001StockCodefor万科Ais00000
20、2StockCodefor*ST国农is000004计算新列值计算新列值 语句格式:Calculating Values =Calculating Expression of columns 例例20.5计算股票每日成交金额。proc sqloutobs=3;titleTradingSum;selectstkcd,lstknm,clpr*trdvolformat=12.2fromResDat.qttndist;quit;TradingSum最新股票名称|股票代码|StoLatestStockckCodeName-000001S深发展A3946648.52000001S深发展A1420743.6
21、0000001S深发展A1120732.50为列分配别名为列分配别名 语句格式:SELECT calculation-form 别名必须符合SAS名称要求,别名只在当前的查询中有效。例例20.6为列分配别名。proc sqloutobs=3;titleTradingSum;selectstkcd,lstknm,clpr*trdvolastrdsumformat=12.2fromResDat.qttndist;quit;TradingSum最新股票名称|股票代码|StoLatestStockckCodeNametrdsum-000001S深发展A3946648.52000001S深发展A1420
22、743.60000001S深发展A1120732.50CALCULATED 语句语句 语句格式:Calculated Column-name使用别名引用一个计算过的列值时,必须使用Calculated关键词,并将Calculated放在列名称之前,以此告知PROCSQL这个列是经计算得到的。proc sqloutobs=3;selectstkcd,lstknm,date,clpr*mcfacprasadjprformat8.2,(calculatedadjpr*trdvol)astrdsumformat12.2fromresdat.qttndist;quit;最新股票名称|股票代码|StoLa
23、testStockckCodeName日期|Dateadjprtrdsum-000001S深发展A1991-01-0266.943946648.52000001S深发展A1991-01-0366.891420743.60000001S深发展A1991-01-0466.751120732.50CASE表达式表达式 语句格式: CASE WHEN when-condition THEN result-expression END例例20.7简单形式的Case表达式。proc sqloutobs=3;selectstkcd,lstknm,lstdt,casewhenexchflg=1then上交所w
24、henexchflg=2then深交所else所有交易所endasexchflgfromresdat.lstkinfoorderbylstdt;quit;例中,将股票信息表lstkinfo交易所标识(exchflg)的编码值进行转换,同时得到新的交易所标识列及相关数值。最新股票名称|股票代码|StoLatestStock股票上市日|LckCodeNameistDateexchflg-000005ST星源1990-12-10深交所600652爱使股份1990-12-19上交所600602广电电子1990-12-19上交所使用使用ORDER BY语句排序语句排序 语句格式语句格式ORDER BY
25、order-by-item , . order-by-item ; 选项说明:order-by-item可以是如下:integer等同于一个列在SELECT子句中的位置column-name列的名称或者别名sql-expression见附录中的sql-expressionASC升序排列数据,默认方式DESC降序排列数据例例20.9对股票上市时间列进行排序。procsqloutobs=3;selectlstknm,lstdtfromresdat.lstkinfoorderbylstdt;quit;最新股票名称|LatestStock股票上市日|LNameistDate-ST星源1990-12-1
26、0爱使股份1990-12-19广电电子1990-12-19可以通过指定列在SELECT子句中的整数位置对该列排列。例例20.11按第4列排序。procsqloutobs=3;selectstkcd,lstknm,date,clpr*mcfacprasadjprformat8.2fromresdat.qttndistorderby4desc;quit;最新股票名称|股票代码|StoLatestStockckCodeName日期|Dateadjpr-600652爱使股份2001-05-15105881.8600652爱使股份2001-05-16103950.1600652爱使股份2001-05-1
27、4103020.1用用WHERE语句选择观测语句选择观测 语句格式语句格式WHERE sql-expression 选项说明: sql-expression (见sql-expression定义). 例例20.13用WHERE语句选择1991年以前上市的股票。proc sqloutobs=3;selectlstknm,lstdtfromresdat.lstkinfowherelstdt31dec1991d;quit;最新股票名称|LatestStockName股票上市日|ListDate-S深发展A1991-04-03万科A1991-01-29*ST国农1991-01-14使用使用IN算符算符
28、例20.14简单IN算符用法。procsqloutobs=3;selectlstknm,stkcdfromresdat.lstkinfowherestkcdin(000001600651000004);quit;最新股票名称|LatestStockName股票代码|StockCode-S深发展A000001*ST国农000004飞乐音响600651使用使用BETWEEN-AND 算符算符 例例20.16使用BETWEEN-AND算符选择满足一定范围的观测。proc sql;createtablestkinfo1991asselect*fromresdat.lstkinfowherelstdtb
29、etween1jan1991dand31dec1991d;quit;使用使用LIKE算符算符 例例20.17使用匹配算符LIKE选择观测。proc sql;selectstkcd,lstknmfromresdat.lstkinfowherelstknmlikeST%;quit;股票代码|StockCode最新股票名称|LatestStockName-000005ST星源600603ST兴业使用汇总函数汇总数据使用汇总函数汇总数据 使用汇总函数(aggregate function or summary function)可以产生数据的统计量。 用用WHERE子句汇总数据子句汇总数据 例例20.
30、19使用乘法函数算出代码为000002的股票调整后的收盘价。procsqloutobs=3;selectstkcd,lstknm,clpr*mcfacprasadjprfromresdat.qttndistwherestkcd=000002;quit;最新股票名称|股票代码|StockCodeLatestStockNameadjpr-000002万科A15.52000002万科A15.57000002万科A15.48使用使用SUM函数函数 例例20.20使用sum函数计算深发展历年派发现金红利总额。procsql;selectsum(dividend)format=8.2astotledvfr
31、omresdat.stk000001;quit;totledv-2.70观测数汇总观测数汇总 语句格式:Select count(distinct ) as proc sql;title Number of total Rows;select count(*) as number from resdat.lstkinfo;quit;NumberoftotalRowsNumber-30使用使用GROUP BY子句进行分组汇总子句进行分组汇总 语句格式语句格式GROUP BY group-by-item 选项说明:integer等同于一个列在SELECT子句中的位置Column-name列的名称或
32、别名Sql-expression见附录sql-expression例例20.22分组进行汇总。procsqloutobs=3;title2005年股票月收益平均值;selectstkcd,avg(monret)fromresdat.monretwhere1jan2005d=date=31dec2005dgroupbystkcd;quit;2005年股票月收益平均值股票代码|StockCode-000001-0.00170000020.025023000004-0.03469用用HAVING子句选择分组数据子句选择分组数据 语句格式语句格式例例20.25算出A股市场股票2005年的交易天数。procsql;selectstkcd,count(*)astrdayfromresdat.dretwhere1jan2005d=date=31dec2005dgroupbystkcdhavingsubstr(stkcd,1,1)in(0,6)orsubstr(stkcd,1,2)=99;quit;股票代码|StockCodetrday-000002212000007241000011230000016239600601241600604232600651239600653240