版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、SAS中的SQL語句完全教程之一:SQL簡介與根本查詢功能本系列全部內容主要以? SQLProcessingwiththeSASSystem(CourseNotes) » 為主進 行講解,本書是在網上下載下來的,但忘了是在哪個網上下的,故不能提供下載鏈 接了,需要的話可以發(fā)郵件向我索取,我定期郵給大家,最后聲明一下所有資料僅 用于學習,不得用于商業(yè)目的,否那么后果自負.1SQU±程步介紹過程步可以實現以下功能:查詢SAS數據集、從SAS數據集中生成報表、以不同方式實現數據集合并、創(chuàng)立或 刪除SASt據集、視圖、索引等、更新已存在的數據集、使得SAS系統(tǒng)可以使用SQL語句、可
2、以和SAS的數據步進行替換使用.注意,SQLM程步并不是用來代替SASB 據步,也不是一個客戶化的報表工具,而是數據處理用到的查詢工具.過程步的特征SQLM程步并不需要對每一個查詢進行重復、每條語句都是單獨處理、不需要 print 過程步就能打印出查詢結果、也不用 sort過程步進行排序、不需要run、要quit來 結束SQLM程步 過程步語句SELECT查詢數據表中的數據ALTER增加、刪除或修改數據表的列CREAT E創(chuàng)立一個數據表DELETE刪除數據表中的列DESCRIB E列出數據表的屬性DROP刪除數據表、視圖或索引INSERT對數據表插入數據RESET沒用過,不知道什么意思SELE
3、CT選擇歹U進行打ERUPDAT E對已存在的數據集的列的值進行修改2SQ溪本查詢功能語句根本語法介紹SELECT<DISTINCT>object-item<,.object-item>FROMfrom-list<WHEREsql-expression><GROUPBYgroup-by-item<,group-by-item>><HAVINGsql-expression><ORDERBYorder-by-item<,order-by-item>>這里SELECT指定被選擇的列FROM指定被查詢的表名
4、WHER E子數據集的條件GROUPBY各數據集通過group進行分類HAVING根據GROUPBY變量得到數據子集ORDERB Y寸數據集進行排序語句的特征選擇滿足條件的數據、數據分組、對數據進行排序、對數據指定格式、一次最多查詢32個表.這里還要提到的就是,在 SAS系統(tǒng)中,對于表名和變量名一般不超過 32個字符,對于庫名,文件引用名,格式等不能超過8個字符關鍵字Validate關鍵字只存在于select語句中、可以在不運行查詢的情況下測試語句的語法、檢查列名是否合法、對于不正確的查詢將打印其消息.例:Iprocsql;2validate3selectRegion,Product,Sale
5、s 45whereRegion='Africa'NOTE:PROCS詢有有效語法.6quit;此外,我們還可以用noexec選項也可以用來進行語法測試.例:7procsqlnoexec;8selectRegion,Product,Sales910whereRegion='Africa'NOTE由于NOEXEC項,未執(zhí)行語句.11quit;這里提示未執(zhí)行,未提示錯誤,說明該語句沒有語法錯誤.但是如果參加一個表里 沒有字段,這里就會出現錯誤,例:12procsqlnoexec;13selectRegion,Product,Sales,test1415whereReg
6、ion='Africa'ERRORS下這些列在起作用的表中沒有找到:test.16quit;查詢列我們可以像那樣查詢指定列,也可以用*來查詢所有列.例:procsql;select*;quit;這里我們可以用feedback選項來查看到底我們選擇了哪些列:17procsqlfeedback;18select*19;NOTE:Statementtransformsto:520quit;這時,我們可以看到從表中選擇了8個列消除重復值我們可以用distinct 選項來消除重復值.例如,我們要得到沒有重復的所有地區(qū)的名稱:procsql;selectdistinctRegionquit
7、;子集查詢比擬運算符先列出where語句用到的比擬運算符:LT<J、于GT次于EQ等于LE<=J、于或等于GE>關于或等于NE八不等于例如,我們要查詢sales大于100000的所有數據:procsql;select*wheresales>100000;quit;:只要滿足in里的任意一個值,表達式即為真,例如,我們要選擇Region在Africa和EasternEurope的所有數據:procsql;select*whereRegionin('Africa','EasternEurope');quit;邏輯運算符OR成AND&:
8、NOT昨例如,選擇Region在Africa和EasternEurope ,且銷售額大于100000的所有數據: procsql;select* whereRegionin('Africa','EasternEurope')andsales>100000;quit;或:判斷某列是否包含指定字符串例如,選擇列Region包含Afr '的數據:procsql; select*whereRegion'Afr'quit;或ISMISSING判斷某列數據是否為空例如,如果找出Region為空的數據:procsql; select*whereR
9、egionismissing;quit;注意,這里我們還可以用以下表達式對 where語句進行替換.如果region為數值型 變量,那么可以用region=.,如果region為字符型變量,那么可以用region=''進行 替換.:選擇某一區(qū)間的數據例如選擇sales大于100000,但小于200000的所有數據:procsql;select* wheresalesbetween100000and200000;quit;:判斷是否能匹配某些字符例如,選擇以region以A開頭的所有地區(qū)procsql;select*whereRegionlike'A%'quit;
10、這里注意有兩類通配符,'可以通配任意個任意字符,只能通配一個任意字符:類似匹配這里由于里沒有符合要求的數據,所有就用書上的例子說明一下吧:Wherelastname=* 'smith',出來的結果可能是:smith, smythe 等 表達式 我們可以通過已有的列進行計算來得到新的列, 這時用關鍵詞as來給新的列賦列名, 例如:procsql;selectRegion,Product,Sales,Stores,Sales/Storesassalesperstores quit;這時結果就會多一列 salesperstores ,用來得到該地區(qū)該產品每個商店的平均銷售量.
11、這里要注意的是,在創(chuàng)立表達式時,我們還可以在SQL里用到SAS中的除LAG和DIFF之外的所有函數.這里我們還可以用表達式計算出來的結果來進行子集查詢,但一定要記住用calculated關鍵詞.例如我們要找出商店平均銷售量大于5000的數據:方法一:procsql;selectRegion,Product,Sales,Stores,Sales/StoresassalesperstoreswhereSales/Stores>5000;quit;方法二:procsql;selectRegion,Product,Sales,Stores,Sales/Storesassalesperstores
12、wherecalculatedsalesperstores>5000;quit;查詢結果展示數據排序默認的排序方式是升序,我們可以用DES或鍵詞來進行降序排列.例如以sales降序排列數據:procsql;select* orderbySalesDESC; quit;這里提示一下,我們可以用任意多列進行排序,包括表達式結果不用calculated , 但最好是選擇的列.與 FORMATLABEL改變輸出變量名的內容FORMA T改變列的值的輸出方式例如,改變 salesperstores 的 label 和 formatprocsql;selectRegion,Product,Sales
13、,Stores,Sales/Storesassalesperstoreslabel='salesperstores'format=;quit;處理SQL用函數MEA破AVG均值COUNT N或FREQ非缺失值個數MAX最大值MIN:最小值NMISS缺失值個數STD標準差SUM求和VAR方差求和sum procsql;selectRegion,Product,Sales,Stores, sum(Sales,Inventory,Returns)astotal;quit;求均值avgprocsql;selectRegion,Product,Sales,Stores, avg(Sale
14、s)assalesavg;quit;分組求均值groupbyprocsql;selectRegion, avg(Sales)assalesavggroupbyRegion;quit;計數countprocsql;selectRegion,count(*)ascountgroupbyRegion;quit;數據子集procsql;selectRegion,count(*)ascountgroupbyRegionhavingcount(*)>50;quit;其它的就不多作介紹了,多用用就熟悉了子查詢找出regions 平均 sales 大于全部平均 sales 的regionprocsql;
15、selectRegion,avg(Sales)assalesavggroupbyRegionhavingavg(Sales)>(selectavg(Sales);quit;關鍵詞介紹>ANY(20,30,40)最終效果:>20<ANY(20,30,40)最終效果:<40=ANY(20,30,40)最終效果:=20or=30or=40例如, 選擇出 region 為 unitedstate 的 sales 小于任意 region 為 africa 的 sales的數據procsql;selectRegion,SaleswhereRegion='UnitedS
16、tates'andSales<any='Africa');quit;這個例子沒有多少意義,只是說明一下 any的用法關鍵詞介紹>ALL(20,30,40)最終效果:>40<ALL(20,30,40)最終效果:<20例如, 選擇出 region 為 unitedstate 的 sales 小于所有 region 為 africa 的 sales的數據procsql;selectRegion,SaleswhereRegion='UnitedStates'andSales<all='Africa');quit
17、;與 NOTEXISTSprocsql;select*whereexists (select*;quit;SAS中的SQL語句完全教程之二:數據合并與建表、建視圖SAS中的SQL語句完全教程之二:數據合并與建表、建視圖索引等本系列全部內容主要以? SQLProcessingwiththeSASSystem(CourseNotes) » 為主進行講解,本書是在網上下載下來的,但忘了是在哪個網上下的,故不能提供下載鏈 接了,需要的話可以發(fā)郵件向我索取,我定期郵給大家,最后聲明一下所有資料僅 用于學習,不得用于商業(yè)目的,否那么后果自負.1連接joins 分為內連接 innerjoins 和
18、夕卜連接 outerjoins內連接:僅返回匹配的數據,最多可以有32個表同時進行內連接外連接:返回所有匹配的數據和非匹配的數據,一次只能有兩個表或視圖進行外連接迪卡爾積:返回表內所有可能的匹配情況.例如表 A有10*20的數據,表B有30*40 的數據,那么兩個表的迪卡爾積有(10+30) * (20+40) =40*60的數據我們先建立兩個數據集:datamarch;inputflight$3.+5datedate7.+3departtime5.+2orig$3.+3dest$3.+7miles+6boarded+6capacity;.;.;cards;21901MAR949:31LGAL
19、ON344219825062201MAR9412:19LGAFRA385720725013201MAR9415:35LGAYYZ366115178 27101MAR9413:17LGAPAR363513825030201MAR9420:22LGAWAS22910518011402MAR947:10LGALAX247511921020222MAR9410:43LGAORD74012021021902MAR949:31LGALON344214725013202MAR9415:35LGAYYZ36610617820223MAR9410:43LGAORD74011821021903MAR949:31L
20、GALON344219725062203MAR9412:19LGAFRA385718025027103MAR9413:17LGAPAR363514725020224MAR9410:43LGAORD74014821021904MAR949:31LGALON344223225062204MAR9412:19LGAFRA385713725013204MAR9415:35LGAYYZ36611717827104MAR9413:17LGAPAR363514625030204MAR9420:22LGAWAS22911518011405MAR947:10LGALAX247511721020225MAR941
21、0:43LGAORD74010421021905MAR949:31LGALON344216025062205MAR9412:19LGAFRA385718525013205MAR9415:35LGAYYZ36615717827105MAR9413:17LGAPAR363517725011406MAR947:10LGALAX247512821020226MAR9410:43LGAORD740115210 21906MAR949:31LGALON344216325013206MAR9415:35LGAYYZ36615017830206MAR9420:22LGAWAS2296618011407MAR9
22、47:10LGALAX247516021013207MAR9415:35LGAYYZ36616417827107MAR9413:17LGAPAR363515525030207MAR9420:22LGAWAS229135180;run;datadelay;inputflight$3.+5datedate7.+2orig$3.+3dest$3.+3delaycat$15.+2destype$15.+8delay;informatdatedate7.;formatdatedate7.;cards;11401MAR94LGALAX1-10MinutesDomestic820221MAR94LGAORD
23、NoDelayDomestic-562201MAR94LGAFRANoDelayInternational-5 13201MAR94LGAYYZ11+MinutesInternational14 30201MAR94LGAWASNoDelayDomestic-2 11402MAR94LGALAXNoDelayDomestic0 20222MAR94LGAORD1-10MinutesDomestic5 21902MAR94LGALON11+MinutesInternational1862202MAR94LGAFRANoDelayInternational0 13202MAR94LGAYYZ1-1
24、0MinutesInternational527102MAR94LGAPAR1-10MinutesInternational430202MAR94LGAWASNoDelayDomestic011403MAR94LGALAXNoDelayDomestic-120223MAR94LGAORDNoDelayDomestic-121903MAR94LGALON1-10MinutesInternational462203MAR94LGAFRANoDelayInternational-213203MAR94LGAYYZ1-10MinutesInternational627103MAR94LGAPAR1-1
25、0MinutesInternational230203MAR94LGAWAS1-10MinutesDomestic511405MAR94LGALAXNoDelayDomestic-220226MAR94LGAORDNoDelayDomestic-321906MAR94LGALON11+MinutesInternational2713206MAR94LGAYYZ1-10MinutesInternational730206MAR94LGAWAS1-10MinutesDomestic162207MAR94LGAFRA11+MinutesInternational2113207MAR94LGAYYZN
26、oDelayInternational-227107MAR94LGAPAR1-10MinutesInternational430207MAR94LGAWASNoDelayDomestic0;run;內連接procsql;createtableinnerjoinsas selecta.*,b.* fromMarcha,Delayb =外連接 左連接leftjoin procsql;createtableleftjoinsasselect*fromMarchaleftjoinDelayb=右連接 rightjoin procsql;createtablerightjoinsas select*fr
27、omMarcharightjoinDelayb=全連接fulljoin procsql;createtablefulljoinsasselect*fromMarchafulljoinDelayb=迪卡爾積procsql;createtablecartesianasselecta.*,b.*fromMarcha,Delayb;quit;這里再大概說明一下內外連接的實現的根本原理:首先生成兩個數據表的迪卡爾積, 然后再根據where語句來選擇符合條件的數據作為輸出結果.當然,在實際處理過 程中,SQLM程步會對這個迪卡爾積的數據集進行優(yōu)化,將其劃分成小塊數據進行處理.2復雜的連接這里由于找不到很好
28、的例子來說明如何處理復雜的連接,因此就不講解了,大概說 一下思路吧:簡單地說,對于復雜的查詢,我們應該將該查詢分解成幾個小的子查 詢,然后對每個子查詢的結果進行測試,最后將所有的子查詢結合起來就組成了這 個復雜的查詢.這樣會比一來就寫復雜的查詢容易得多.3數據集SET操作這里有四類 SETB作,分另fj是 EXCEPTINTERSECT UNION OUTERUNION EXCEP T得到除第二個數據集以外的所有第一個數據集里的數據 INTERSECT得到第一個數據集和第二個數據集都有的數據UNION得到兩個數據集所有的數據,這里如果兩個數據集有相同的數據,重復數據 只出現一次OUTERUNI
29、O N導到兩個數據集所有的數據.還有兩個關鍵詞來修改SETft作的彳亍為:ALL和CORRESPONDINGALL.:并不刪除重復值,不能與 OUTERUNION用注意,用ALL關鍵詞,一種情況 是你不管是否會有重復值,另一個情況是不可能出現重復值,例如有主鍵的數據 CORRESPOND 1NG保存兩個數據集都有的字段,一般簡寫為CORR找出所有沒有延遲的航班和日期:procsql;selectflight,datefromMarchexceptselectflight,datefromDelay;quit;注意:這里重復值已經被刪除.如果要得到所有的包含重復值的數據,就要用到關鍵詞ALL:p
30、rocsql;selectflight,datefromMarchexceptALLselectflight,datefromDelay;quit;如果只保存兩個數據集都有的字段,那么用到關鍵詞CORRESPOND IN嗡寫為COR尺 procsql;select*fromMarchexceptCORRselect*fromDelay;quit;找出所有延遲的航班和日期:procsql;selectflight,datefromMarchINTERSECTselectflight,datefromDelay;quit;關鍵詞ALL和CORRESPONDING EXCEP并一樣,這里不再作介紹選
31、擇所有的數據,這里的重復值只出現一次procsql;selectflight,datefromMarchUNIONselectflight,datefromDelay;quit;關鍵詞ALL和CORRESPONDING EXCEP并一樣,這里不再作介紹 procsql;selectflight,datefromMarchOUTERUNIONselectflight,datefromDelay;quit;這里,如果我們用到關鍵詞 CORR就可以將相同字段的數據結合到一起:procsql;select*fromMarchOUTERUNIONCORRselect*fromDelay;quit;4建表
32、建空表通過指定變量建空表procsqlnoprint;createtablepercent(varnamechar(30),Industrychar(4),begindatenumformatdate9.label='thebeginningdate',='theendingdate',P_1num,P_5num,P_95num,P_99num);quit;拷貝數據集來建空表procsqlnoprint;createtableDelaycopy(keep=flightdate) likeDelay;quit;查詢語句中,用outobs選項來建空表procsqln
33、oprintoutobs=0;createtableflight114asselect*fromDelay;quit;對數據表增加數據主要有三種方法:語句procsqlnoprint;insertintoflight114setflight='302',date='07MAR94'd,orig='LGA',dest=WAS',delaycat='NoDelay',destype='Domestic',delay=0;quit;語句procsqlnoprint;insertintoflight114value
34、s('271','07MAR94'd,'LGA','PAR','1-10Minutes','International',4);quit;條件查詢:建表和導入數據同時完成procsqlnoprint;createtableflight114asselect*fromDelaywhereflight='114'quit;5完整性約束完整性約束的好處是保證 SAS數據集的連續(xù)性和正確性,它在我們更新數據或插入 新的數據時,驗證新的數據是否符合該變量的約束條件.完整性約束需要以上版本,符合
35、ANSI標準,可以在表建立時或表有數據后建立約束, 但不能被用于視圖,也不能用于低于版本的SAS系統(tǒng)建立的數據集.五大類完整性限制:NOTNULL CHECK UNIQUE PRIMARYKEYFOREIGNKEYNOTNUL L不許出現缺失值CHEC K指定該變量可以輸入哪些值UNIQUE每個值必須是唯一的,其值可以為空,但只能有一個值為空PRIMARYKE仕鍵,每個值必須是唯一且非空的FOREIGNKE健它表的主鍵,即外鍵,其值為關聯表的主鍵的值且非空例:procsqlnoprint;createtablepercent(varnamechar(30),Industrychar(4),be
36、gindatenumformatdate9.label='thebeginningdate',='theendingdate',percentnum,CONSTRAINTpercent_checkcheck);quit;這時,如果我們插入的數據中,percent>1的話,將會出現錯誤.回滾 ROLLBACKS當我們用INSERT UPDATE勺時候,操作要等到發(fā)生錯誤的時候才會停止,這時會出現一個問題,就是數據表的一些數據更新了,而另一些數據沒更新,這時如果我們要回到原來的狀態(tài),就需要用到 UNDO_POLICY項進行回滾.UNDO_POLICY三個選項:
37、REQUIRED缺省選項,取消所有的更新或新插入的數據.這里要注意的是,此操作不一定完全能成功.NONE阻止所有的與約束不符的更新或新數據OPTOINAL取消所有可以成功取消的更新或新插入的數據本功能用得很少,所以只是譯一下,請大家查閱相關文獻.6創(chuàng)立視圖與索引視圖視圖最大的好處是它只是一個存儲的查詢,因此不包含任何數據,這可以減少磁盤 的使用空間.其它的功能與數據庫的表類似.創(chuàng)立視圖語法:CreateViewView-nameasQuery-expression;例:procsqlnoprintoutobs=0;createViewdelayviewasselect*fromDelay;qu
38、it;索引語法:Create<unique>Indexindex-nameOntable-name(column-name,column-name);視圖和索引都用得很少,所以這里就不作講解了,大家查閱相關文獻吧.7維護表這里主要講一下如何更新或刪除已存在的表的數據,如何對一個表增加、減少、或改變其列的屬性,如何刪除表、視圖和索引.更新數據這里主要用update來更新表的數據,語法如下Updatetable-nameSetcolumn-name=expression,Setcolumn- name=expression,Whereexpression;注意,這里的where 一定要
39、寫清楚,如果沒有的話,那么會更新所有的數據.例:procsqlnoprint;updatedelaysetdelaycat='Delay'wheredelay=0;quit;條件處理用CAS時句來實現條件處理.例如,對根據 sales的大小進行分類:語法:Selectcolumn Case<case-operand>Whenwhen-conditionthenresult-expression<Whenwhen-conditionthenresult-expression><elseresult-expression>End;例:procsq
40、l;createtableshoesrankasselect*,(casewhensales>100000then'good'else'bad'end)asrank;quit;刪除行語法:Deletefromtable-nameWhereexpression;例:procsql;DeletefromshoesrankWhereRegion='Africa'quit;改變列語法:AlterTabletable-nameAddcolumn-definition,column- definition,Dropcolumn-name,column-
41、 name,Modifycolumn-definition,column- definition,對已存在的數據表增加一個列:例:procsql;altertableshoesrankaddaddcolumnnumformat=,addcolumnmorechar(10);quit;從已存在的數據表中刪除列,例:procsql;altertableshoesrankdropaddcolumn;quit;修改某列的屬性,例:procsql;altertableshoesrankmodifyaddcolumnmorechar(20)label='modifyaddlabel'qui
42、t;刪除表、視圖、索引語法:DropTabletable-name,table- name,;DropViewView-name,View- name,;DropIndexindex-name,index- name,;Fromtable-name;例:procsql;droptableshoesrank;quit;SAS中的SQL語句完全教程之三:SQL過程步的其它特征SAS中的SQL語句完全教程之三:SQL過程步的其它特征本系列全部內容主要以?SQLProcessingwiththeSASSystem(CourseNotes)為主進行講解,本書是在網上下載下來的,但忘了 是在哪個網上下的,
43、故不能提供下載鏈接了,需要的話可以發(fā)郵件向我索取,我定期郵給大家,最后聲明一下所有資料僅用 于學習,不得用于商業(yè)目的,否那么后果自負.前面兩局部內容都比擬簡單,本節(jié)內容才是本系列要介紹的重點.不過這里裝的內容都是點到即止,如果以后有時間,會進 行更詳細地講解.1SQL過程步選項SQL過程步選項的作用主要是可以從更細節(jié)的方式去限制SQL過程步,并且可以在不執(zhí)行過程的情況下對程序進行測試等.下面介紹一以下出來的選項,這些選項大多經常用到,更多的選項可以參考 SAS幫助.INOBS:進行一個查詢時,對每個源數據表進行N行限制,僅對這N行的數據進行查詢.OUTOBS :指定查詢輸出結果的觀測數LOOP
44、S:指定SQL過程步內循環(huán)的次數(此選項我用得比擬少,誰明白的可以講一下,多謝)NOPROMPT和PROMPT:修改上述三個選項的效果,從而讓你選擇是否繼續(xù)或停止選項的效果.PRINT和NOPRINT:限制是否打印選擇的數據結果NONUMBER和NUMBER :限制是否在第一列打印觀測值編號DOUBLE和NOBOUBLE :輸入報表是否隔行顯示NOFLOW 和FLOW 和FLOW=n和FLOW=nm :指定列寬,n指定列寬,m指定行寬選項procsql double;selectflight,datefromMarchUNIONselectflight,datefromDelay;quit;選
45、項注意:這里inobs選項只讀取每個源表前10條數據進行后續(xù)的操作,如下面的日志所示.兩個表都只讀取10條數據進行關聯,最后得到7條關聯好的數據.237procsqlinobs=10;238createtabletmpas239selecta.*,b.*240fromMarcha,Delayb241=變量"flight已經存在于文件中.WARNING:變量“date已經存在于文件中.WARNING:變量“orig已經存在于文件中.WARNING:變量“des已經存在于文件中.WARNING:別名=B由于 INOBS=選項.WARNING:別名=A由于 INOBS=選項.NOTE:表創(chuàng)
46、立完成,有7行,11歹限選項 這個選項的功能與inobs相似,不同的是,這個選項指定結果的觀測值數量,而不是讀取源表的數量,這在我們限制輸出結 果的數據量時非常有用.243procsqloutobs=10;244createtabletmp1as245selecta.*,b.*246fromMarcha,Delayb247=變量"flight已經存在于文件中.WARNING:變量“date已經存在于文件中.WARNING:變量“orig已經存在于文件中.WARNING:變量“des已經存在于文件中.WARNING:語句由于OUTOBS=10選項而過早終止.NOTE:表創(chuàng)立完成,有10
47、行,11列.選項這里prompt選項,可以讓你選擇是否還是根據原來的設置進行動作,或者繼續(xù)操作.如下面的日志所以,如果直接選擇停 止,那么得到的結果,如果一直按繼續(xù),那么得到如下結果:255procsqlinobs=10prompt;256createtabletmp3as257selecta.*,b.*258fromMarcha,Delayb259=變量"flight已經存在于文件中.WARNING:變量“date已經存在于文件中WARNING:變量“orig已經存在于文件中WARNING:變量“des已經存在于文件中.NOTE:表創(chuàng)立完成,有19行,11列.選項procsql o
48、utobs=4number;select*fromMarch;quit;選項對上述SQL語句加上reset選項,使其不輸出序號procsql outobs=4number;resetnonumber;select*fromMarch;quit ;2DICTIONARY介紹DICTIONARY可以得到很多SAS文件和會話等很多的元數據,包括 SAS文件,外部文件,系統(tǒng)選項、宏、標題、腳注等.DICTIONARY是在初始化時就創(chuàng)立,自動更新,并只允許讀取操作,故不能修改.下面列舉一下SAS中DICTIONARY所包含的表:SASV8DICTIONARY 所包含的表:CATALOGS : SAS目錄
49、的信息COLUMNS : SAS變量和列的信息EXTFILES :外部數據信息INDEXES :參與索引的列的信息MACROS :宏相關信息MEMBERS :所有數據類型表、視圖、目錄等的信息OPTIONS:當前會話選項STYLES : ODS的樣式信息TABLES :表和數據集信息TITLES :標題和腳注信息VIEWS :視圖信息SASV9DICTIONARY所包含的新的表:CHECK_CONSTRAINTS : CHECK 約束信息CONSTRAINT_COLUMN_USAGE :約束歹U使用信息CONSTRAINT_TABLE_USAGE :約束表使用DICTIONARIES : DI
50、CTIONARY 所有表及其列ENGINES :可用的弓I擎FORMATS :可用的格式GOPTIONS : SAS/GRAPH 選項LIBNAMES : LIBNAME 信息REFERENTIAL_CONSTRAINTS :相關約束REMEMBER :已記錄的信息TABLE CONSTRAINTS :表約束查看中各表內容查看各表的結構,以查看為例:procsql;quit;這里可以從日志里看到表的結構.要查看這個表的數據,可以通過以下語句實現,這里我們只輸出前10條數據procsql outobs=10;select*;quit ;使用DICTIONARY 的信息查看SASHELP庫里的文件
51、信息:procsql ;optionsnolabelnocenter;selectmemname,nobs,nvar,crdatewherelibname='SASHELP'quit ;注意,這里的庫名都是大寫.查看SASHELP庫里有列名為tabname的所有表:procsql;optionsnolabelnocenter;selectmemnamewherelibname='SASHELP'andname='tabname'quit;注意這里是用的信息用來撮的信息:proctabulate data=8.;classlibnamememtyp
52、e;keylabelN="tablelibname,memtype/rts=10misstext='None'run ;DICTIONARY是一個非常有用的信息庫,本文主要是介紹一下其根本功能,以后有時間的話會對其進行詳細介紹.3SQL過程步與宏語言的交互SQL過程步可以創(chuàng)立SAS宏變量,也可以生成一些自動的宏變量,從其中可以更好地理解SQL處理過程.在SQL過程中使用宏變量%letoutputnumber=10;procsql outobs=&outputnumber;optionsnolabelnocenter;select*wherelibname=&q
53、uot;SASHELP'quit;這個很簡單,就不講了,下面講一下本節(jié)的重點.創(chuàng)立宏變量SQL過程步可以通過into語句來創(chuàng)立或更新宏變量,主要有三種方式.這里要注意的是,在使用into語句創(chuàng)立宏變量時,我們是不能在createtable或createview語句里使用的.當我們不需要輸出結果時,可以用 noprint選項.結果只有一行Selectcol1,col2, Into:mvar1,:mvar2, From 例:procsql noprint;selectavg(sales),min(sales),max(sales)into:mean,:min,:max;quit ;%put
54、&mean&min&max;這種方式適合輸出結果只有一行的情況.提取前N行的值Selecta,b, Into:a1-:an,:b1-:bnFrom 這種方法前前N行的查詢結果輸入到一系列的N個宏變量中例:procsql noprint;selectRegion,count(*)asfrequencyinto:Region1-:Region3,:freq1-:freq3groupbyRegion;quit;%put&Region1&Region2&Region3;%put&freq1&freq2&freq3;提取所有數據Se
55、lectcol1,col2, Into:macrovar1,:macrovar2, Separatedby ' delimiter 'From 這里將每列的所有數據都輸出到一個宏變量中,并以指定的分隔符分開.例:procsql noprint;selectdistinctRegioninto:RegionAllseparatedby',';quit;%put&RegionAll;過程步自動產生的宏變量SQLOBS:記錄輸出結果或被刪除的觀測值個數SQLRC:包含每個SQL語句的返回代碼SQLOOPS:包含SQL過程步內循環(huán)的次數例:procsql ;se
56、lect*;quit ;%put&SQLOBS;得到輸出觀測的條數.4程序測試與效率這里主要介紹幾個SQL過程步的選項:Exec/Noexec:限制SQL語句是否執(zhí)行Nostimer/Stimer :在SAS日志中報告每個SQL語句的效率統(tǒng)計數據Noerrorstop/Errorstop:批處理時限制當有錯誤發(fā)生時,是否要檢查語法例:noexe與 feedback66procsqlfeedbacknoexec;67select*;NOTE:Statementtransformsto:,;NOTE:由于NOEXEC選項,未執(zhí)行語句.68quit;NOTE: "PROCEDURESQL所用時間總處理時間實際時間秒CPU時間秒這里我們要注意的是,在比擬不同SQL語句的效率時,一定要用 CPU時間,而不是用實際時間,由于實際時間可能會因運行機器的環(huán)境而有很大的出入.還要注意的是,對于同一個數據集,在比擬效率時,一定要考慮到該數據集第一次運行后其 排序等已經發(fā)生變化,會對效率也有影響.在SQL過程步中使用SAS數據步的選項在SQL過程步中使用SAS數據步的選項UsingDataSet
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年生態(tài)環(huán)境治理保護合同
- 2024年版項目監(jiān)工聘用合同
- 特崗英語課程設計
- 現代詩課程設計分享
- 電子表課程設計c語言
- 測繪工程課程設計選題
- 社交軟件銷售工作總結
- 航空航天顧問工作總結
- 保健品行業(yè)營銷策略總結
- 餐飲團購前臺工作總結
- 水泥行業(yè)數字化轉型服務方案
- 深圳市南山區(qū)2024-2025學年第一學期期末教學質量檢測九年級物理 24-25上九年級物理
- 應急設施設備和物資儲備管理制度(4篇)
- 團委書記個人工作總結
- 高危多發(fā)性骨髓瘤診斷與治療中國專家共識(2024年版)解讀
- 2024版房屋市政工程生產安全重大事故隱患判定標準內容解讀
- 江蘇省鎮(zhèn)江市實驗學校2023-2024學年九年級上學期期末考試化學試卷
- 期末 (試題) -2024-2025學年人教PEP版(2024)英語三年級上冊
- GB/T 32066-2024煤基費托合成液體石蠟
- 安慶市農業(yè)雪災恢復重建和救災資金使用情況總結
- 食品工程原理課程設計攪拌器的設計
評論
0/150
提交評論