SAS中的SQL語(yǔ)句大全_第1頁(yè)
SAS中的SQL語(yǔ)句大全_第2頁(yè)
SAS中的SQL語(yǔ)句大全_第3頁(yè)
SAS中的SQL語(yǔ)句大全_第4頁(yè)
SAS中的SQL語(yǔ)句大全_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、資料收集于網(wǎng)絡(luò),如有侵權(quán) 請(qǐng)聯(lián)系網(wǎng)站刪除 SAS中的SQL語(yǔ)句完全教程之一:SQL簡(jiǎn)介與基本查詢功能 本系列全部?jī)?nèi)容主要以 SQL Processing with the SAS System (Course Notes)為主進(jìn)行講解, 本書是在網(wǎng)上下載下來的, 但忘了是在哪個(gè)網(wǎng)上下的, 故不能提供下載鏈接了, 需要的話可 以發(fā)郵件向我索取, 我定期郵給大家, 最后聲明一下所有資料僅用于學(xué)習(xí), 不得用于商業(yè)目 的,否則后果自負(fù)。 1 SQL過程步介紹 1.1 SQL過程步可以實(shí)現(xiàn)下列功能: 查詢SAS數(shù)據(jù)集、從SAS數(shù)據(jù)集中生成報(bào)表、以不同方式實(shí)現(xiàn)數(shù)據(jù)集合并、創(chuàng)建或刪除SAS 數(shù)據(jù)集、視圖、索

2、引等、更新已存在的數(shù)據(jù)集、使得SAS系統(tǒng)可以使用 SQL語(yǔ)句、可以和 SAS的數(shù)據(jù)步進(jìn)行替換使用。注意,SQL過程步并不是用來代替 SAS數(shù)據(jù)步,也不是一個(gè)客 戶化的報(bào)表工具,而是數(shù)據(jù)處理用到的查詢工具。 1.2 SQL過程步的特征 SQL過程步并不需要對(duì)每一個(gè)查詢進(jìn)行重復(fù)、每條語(yǔ)句都是單獨(dú)處理、不需要print過程步 就能打印出查詢結(jié)果、 也不用sort過程步進(jìn)行排序、 不需要run、要quit來結(jié)束SQL過程步 1.3 SQL過程步語(yǔ)句 SELEC:T 查詢數(shù)據(jù)表中的數(shù)據(jù) ALTER增加、刪除或修改數(shù)據(jù)表的列 CREATE創(chuàng)建一個(gè)數(shù)據(jù)表 DELETE刪除數(shù)據(jù)表中的列 DESCRIBE 列出

3、數(shù)據(jù)表的屬性 DROP刪除數(shù)據(jù)表、視圖或索引 INSERT 對(duì)數(shù)據(jù)表插入數(shù)據(jù) RESET 沒用過,不知道什么意思 SELECT 選擇列進(jìn)行打印 UPDATE 對(duì)已存在的數(shù)據(jù)集的列的值進(jìn)行修改 2 SQL基本查詢功能 2.1 SELECT語(yǔ)句基本語(yǔ)法介紹 SELECT object-item FROM from-list GROUP BY group-by-item ORDER BY order-by-item ; 這里 SELECT 指定被選擇的列 FROM 指定被查詢的表名 WHERE 子數(shù)據(jù)集的條件 GROUP BY將數(shù)據(jù)集通過group進(jìn)行分類 HAVING:根據(jù)GROUP BY勺變量得

4、到數(shù)據(jù)子集 ORDER BY對(duì)數(shù)據(jù)集進(jìn)行排序 2.2 SELECT語(yǔ)句的特征 選擇滿足條件勺數(shù)據(jù)、數(shù)據(jù)分組、對(duì)數(shù)據(jù)進(jìn)行排序、對(duì)數(shù)據(jù)指定格式、一次最多查詢32 個(gè) 表。這里還要提到的就是,在SAS系統(tǒng)中,對(duì)于表名和變量名一般不超過32個(gè)字符,對(duì)于 庫(kù)名,文件引用名,格式等不能超過 8 個(gè)字符 2.3 Validate 關(guān)鍵字 Validate 關(guān)鍵字只存在于 select 語(yǔ)句中、可以在不運(yùn)行查詢的情況下測(cè)試語(yǔ)句的語(yǔ)法、檢查 列名是否合法、對(duì)于不正確的查詢將打印其消息。例: 1 proc sql; 2 validate 3 select Region, Product,Sales 4 from

5、sashelp.shoes 5 where Region = Africa; NOTE: PROC SQL語(yǔ)句有有效語(yǔ)法。 6 quit; 此外,我們還可以用 noexec 選項(xiàng)也可以用來進(jìn)行語(yǔ)法測(cè)試。例: 7 proc sql noexec; 8 select Region, Product,Sales 9 from sashelp.shoes 10 where Region = Africa; NOTE:由于 NOEXEC選項(xiàng),未執(zhí)行語(yǔ)句。 11 quit; 這里提示未執(zhí)行,未提示錯(cuò)誤,說明該語(yǔ)句沒有語(yǔ)法錯(cuò)誤。但是如果加入一個(gè)sashelp.shoes 表里沒有字段,這里就會(huì)出現(xiàn)錯(cuò)誤,例:

6、 12 proc sql noexec; 13 select Region, Product,Sales,test 14 from sashelp.shoes 15 where Region = Africa; ERROR:以下這些列在起作用的表中沒有找到:test. 16 quit; 2.4 查詢列 我們可以像 2.3 那樣查詢指定列,也可以用 *來查詢所有列。例: proc sql; select * from sashelp.shoes; quit; 這里我們可以用 feedback 選項(xiàng)來查看到底我們選擇了哪些列: 17 proc sql feedback; 18 select * 1

7、9 from sashelp.shoes; NOTE: Statement transforms to: select SHOES.Region, SHOES.Product, SHOES.Subsidiary, SHOES.Stores, SHOES.Sales, SHOES.Inventory, SHOES.Returns from SASHELP.SHOES; 20 quit; 這時(shí),我們可以看到從 sashelp.shoes 表中選擇了 8 個(gè)列 2.5 消除重復(fù)值 我們可以用 distinct 選項(xiàng)來消除重復(fù)值。例如,我們要得到?jīng)]有重復(fù)的所有地區(qū)的名稱: proc sql; sele

8、ct distinct Region from sashelp.shoes quit; 2.6 where 子集查詢 2.6.1 比較運(yùn)算符 先列出 where 語(yǔ)句用到的比較運(yùn)算符: LT 大于 EQ = 等于 LE = 大于或等于 NE A= 不等于 例如,我們要查詢 sales 大于 100000 的所有數(shù)據(jù): proc sql; select * from sashelp.shoes where sales100000; quit; 2.6.2 in :只要滿足 in 里的任意一個(gè)值,表達(dá)式即為真,例如,我們要選擇 Region 在 Africa 和 Eastern Europe 的所

9、有數(shù)據(jù): proc sql; select * from sashelp.shoes where Region in (Africa,Eastern Europe); quit; 2.6.3 邏輯運(yùn)算符 OR|或 AND select * from sashelp.shoes where Region in (Africa,Eastern Europe) and sales100000; quit; 264 CONTAINS或?:判斷某列是否包含指定字符串 例如,選擇列 Region 包含 Afr 的數(shù)據(jù): proc sql; select * from sashelp.shoes where

10、 Region ? Afr; quit; 265 IS NULL或IS MISSING判斷某列數(shù)據(jù)是否為空 例如,如果找出 Region 為空的數(shù)據(jù): proc sql; select * from sashelp.shoes where Region is missing; quit; 注意,這里我們還可以用以下表達(dá)式對(duì) where 語(yǔ)句進(jìn)行替換。如果 region 為數(shù)值型變量, 則可以用 region=. ,如果 region 為字符型變量,則可以用 region= 進(jìn)行替換。 2.6.6 Between and :選擇某一區(qū)間的數(shù)據(jù) 例如選擇 sales 大于 100000 ,但小于

11、200000 的所有數(shù)據(jù): proc sql; select * from sashelp.shoes where sales between 100000 and 200000; quit; 2.6.7 like :判斷是否能匹配某些字符 例如,選擇以 region 以 A 開頭的所有地區(qū) proc sql; select * from sashelp.shoes where Region like A%; quit; 這里注意有兩類通配符, %可以通配任意個(gè)任意字符, _只能通配一個(gè)任意字符 2.6.8 =* :類似匹配 這里由于sashelp.shoes里沒有符合要求的數(shù)據(jù),所有就用書上

12、的例子說明一下吧: Where lastname=* smith來的結(jié)果可能是:smith, smythe 等 2.7 表達(dá)式 我們可以通過已有的列進(jìn)行計(jì)算來得到新的列, 這時(shí)用關(guān)鍵詞 as 來給新的列賦列名, 例如: proc sql; select Region, Product,Sales,Stores,Sales/Stores as salesperstores from sashelp.shoes quit; 這時(shí)結(jié)果就會(huì)多一列 salesperstores ,用來得到該地區(qū)該產(chǎn)品每個(gè)商店的平均銷售量。這里要 注意的是,在創(chuàng)建表達(dá)式時(shí),我們還可以在SQL里用到SAS中的除LAG和DI

13、FF之外的所有 函數(shù)。 這里我們還可以用表達(dá)式計(jì)算出來的結(jié)果來進(jìn)行子集查詢,但一定要記住用calculated 關(guān)鍵 詞。例如我們要找出商店平均銷售量大于 5000 的數(shù)據(jù): 方法一: proc sql; select Region, Product,Sales,Stores,Sales/Stores as salesperstores from sashelp.shoes where Sales/Stores5000; quit; 方法二: proc sql; select Region, Product,Sales,Stores,Sales/Stores as salesperstores

14、 from sashelp.shoes where calculated salesperstores5000; quit; 2.8 查詢結(jié)果展示 2.8.1 order by 數(shù)據(jù)排序 默認(rèn)的排序方式是升序,我們可以用DESC關(guān)鍵詞來進(jìn)行降序排列。例如以sales降序排列 數(shù)據(jù): proc sql; select * from sashelp.shoes order by Sales DESC; quit; 這里提示一下,我們可以用任意多列進(jìn)行排序,包括表達(dá)式結(jié)果(不用calculated),但最好 是選擇的列。 2.8.2 LABEL與 FORMAT LABEL改變輸出變量名的內(nèi)容 FOR

15、MAT:改變列的值的輸出方式 例如,改變 salesperstores 的 label 和 format proc sql; select Region, Product,Sales,Stores, Sales/Stores as salesperstores label=sales per stores format=dollar12.2 from sashelp.shoes; quit; 2.9處理SQL常用函數(shù) MEAN或AVG:均值 COUNT或N或FREQ非缺失值個(gè)數(shù) MAX:最大值 MIN :最小值 NMISS:缺失值個(gè)數(shù) STD標(biāo)準(zhǔn)差 SUM:求和 VAR方差 2.9.1 求和

16、sum proc sql; select Region, Product,Sales,Stores, sum(Sales,Inventory,Returns) as total from sashelp.shoes; quit; 2.9.2 求均值 avg proc sql; select Region, Product,Sales,Stores, avg(Sales) as salesavg from sashelp.shoes; quit; 2.9.3 分組求均值 group by proc sql; select Region, avg(Sales) as salesavg from s

17、ashelp.shoes group by Region; quit; 2.9.4 計(jì)數(shù) count proc sql; select Region,count(*) as count from sashelp.shoes group by Region; quit; 2.9.5 HAVING 數(shù)據(jù)子集 proc sql; select Region,count(*) as count from sashelp.shoes group by Region having count(*)50; quit; 其它的就不多作介紹了,多用用就熟悉了 2.10 子查詢 2.10.1找出regio ns平

18、均sales大于全部平均 sales的region proc sql; select Region, avg(Sales) as salesavg from sashelp.shoes group by Region having avg(Sales) (select avg(Sales) from sashelp.shoes); quit; 2.10.2 ANY關(guān)鍵詞介紹 20 ANY(20,30,40) 最終效果 ANY(20,30,40) 最終效果 =ANY(20,30,40) 最終效果 例如,選擇出 region為united state的sales小于任意region為africa的

19、sales的數(shù)據(jù) proc sql; select Region,Sales from sashelp.shoes where Region=United States and SalesALL (20,30,40) 最終效果: 40 ALL (20,30,40) 最終效果: 20 例如,選擇出 region為united state的sales小于所有region為africa的sales的數(shù)據(jù) proc sql; select Region,Sales from sashelp.shoes where Region=United States and Sales1 的話,將會(huì)出現(xiàn)錯(cuò)誤。 5

20、.2 回滾 ROLLBACKS 當(dāng)我們用INSERT或UPDATE的時(shí)候,操作要等到發(fā)生錯(cuò)誤的時(shí)候才會(huì)停止,這時(shí)會(huì)出現(xiàn)一 個(gè)問題, 就是數(shù)據(jù)表的一些數(shù)據(jù)更新了, 而另一些數(shù)據(jù)沒更新, 這時(shí)如果我們要回到原來的 狀態(tài),就需要用到 UNDO_POLICY選項(xiàng)進(jìn)行回滾。 UNDO_POLICY有三個(gè)選項(xiàng): REQUIRED缺省選項(xiàng),取消所有的更新或新插入的數(shù)據(jù)。這里要注意的是,此操作不一定 完全能成功。 NONE:阻止所有的與約束不符的更新或新數(shù)據(jù) OPTOINAL取消所有可以成功取消的更新或新插入的數(shù)據(jù) 本功能用得很少,所以只是翻譯一下,請(qǐng)大家查閱相關(guān)文獻(xiàn)。 6 創(chuàng)建視圖與索引 6.1 視圖 視圖

21、最大的好處是它只是一個(gè)存儲(chǔ)的查詢, 因此不包含任何數(shù)據(jù), 這可以減少磁盤的使用空 間。其它的功能與數(shù)據(jù)庫(kù)的表類似。 創(chuàng)建視圖語(yǔ)法: Create View View-name as Query-expression ; 例: proc sql noprint outobs=0; create View delayview as select * from Delay; quit; 6.2 索引 語(yǔ)法: Create Index index-name On table-name (column-name,column-name); 視圖和索引都用得很少,所以這里就不作講解了,大家查閱相關(guān)文獻(xiàn)吧。

22、 7 維護(hù)表 這里主要講一下如何更新或刪除已存在的表的數(shù)據(jù), 如何對(duì)一個(gè)表增加、 減少、 或改變其列 的屬性,如何刪除表、視圖和索引。 7.1 更新數(shù)據(jù) 這里主要用 update 來更新表的數(shù)據(jù),語(yǔ)法如下 Update table-name Set column-name=expression, Set colu mn- n ame=expressi on, Where expression; 注意,這里的 where 一定要寫清楚,如果沒有的話,則會(huì)更新所有的數(shù)據(jù)。 例: proc sql noprint; update delay set delaycat=Delay where dela

23、y=0; quit; 7.2 條件處理 用CASE語(yǔ)句來實(shí)現(xiàn)條件處理。例如,對(duì)SASHELPhoes根據(jù)sales的大小進(jìn)行分類: 語(yǔ)法: Select column Case When when-condition then result-expression End; 例: proc sql; create table shoesrank as select *, (case when sales100000 then good else bad end) as rank from sashelp.shoes; quit; 7.3 刪除行 語(yǔ)法: Delete from table-nam

24、e Where expression; 例: proc sql; Delete from shoesrank Where Region=Africa; quit; 7.4 改變列 語(yǔ)法: Alter Table table-name Add column-definition,column- definition, Drop column-name,column- name, Modify column-definition,column- definition, 對(duì)已存在的數(shù)據(jù)表增加一個(gè)列:例: proc sql; alter table shoesrank add addcolumn nu

25、m format=comma10.2, addcolumnmore char(10); quit; 從已存在的數(shù)據(jù)表中刪除列,例: proc sql; alter table shoesrank drop addcolumn; quit; 修改某列的屬性,例: proc sql; alter table shoesrank modify addcolumnmore char(20) label=modify add label; quit; 7.5 刪除表、視圖、索引 語(yǔ)法: Drop Table table-name,table- name, ; Drop View View-name,Vi

26、ew- name, ; Drop Index index-name,index- name, ; From table-name; 例: proc sql; drop table shoesrank; quit; SAS 中的 SQL 語(yǔ)句完全教程之三: SQL 過程步的其它特征 SAS中的SQL語(yǔ)句完全教程之三:SQL過程步的其它特征 本系列全部?jī)?nèi)容主要以SQL Processi ng with the SAS System (Course Notes為主進(jìn)行講解,本書是 在網(wǎng)上下載下來的,但忘了是在哪個(gè)網(wǎng)上下的,故不能提供下載鏈接了,需要的話可以發(fā)郵件向我索 取,我定期郵給大家,最后聲明一

27、下所有資料僅用于學(xué)習(xí),不得用于商業(yè)目的,否則后果自負(fù)。 前面兩部分內(nèi)容都比較簡(jiǎn)單,本節(jié)內(nèi)容才是本系列要介紹的重點(diǎn)。不過這里裝的內(nèi)容都是點(diǎn)到即止, 如果以后有時(shí)間,會(huì)進(jìn)行更詳細(xì)地講解。 1 SQL 過程步選項(xiàng) SQL 過程步選項(xiàng)的作用主要是可以從更細(xì)節(jié)的方式去控制 SQL 過程步,并且可以在不執(zhí)行過程的情 況下對(duì)程序進(jìn)行測(cè)試等。 下面介紹一下列出來的選項(xiàng),這些選項(xiàng)大多經(jīng)常用到,更多的選項(xiàng)可以參考 SAS 幫助。 INOBS :進(jìn)行一個(gè)查詢時(shí),對(duì)每個(gè)源數(shù)據(jù)表進(jìn)行N行限制,僅對(duì)這 N行的數(shù)據(jù)進(jìn)行查詢。 OUTOBS:指定查詢輸岀結(jié)果的觀測(cè)數(shù) LOOPS:指定SQL過程步內(nèi)循環(huán)的次數(shù)(此選項(xiàng)我用得比較

28、少,誰(shuí)明白的可以講一下,多謝) NOPROMPT和PROMPT :修改上述三個(gè)選項(xiàng)的效果,從而讓你選擇是否繼續(xù)或停止選項(xiàng)的效果。 PRINT 和 NOPRINT :控制是否打印選擇的數(shù)據(jù)結(jié)果 NONUMBER 和 NUMBER :控制是否在第一列打印觀測(cè)值編號(hào) DOUBLE 和 NOBOUBLE :輸入報(bào)表是否隔行顯示 NOFLOW 和 FLOW 和 FLOW=n 和 FLOW=n m :指定列寬, n 指定列寬, m 指定行寬? 1.1 double 選項(xiàng) proc sql double; select flight,date from March UNION select flight,d

29、ate from Delay; quit; 1.2 inobs 選項(xiàng) 兩個(gè)表都只 注意:這里 inobs 選項(xiàng)只讀取每個(gè)源表前 10 條數(shù)據(jù)進(jìn)行后續(xù)的操作, 如下面的日志所示。 讀取 10 條數(shù)據(jù)進(jìn)行關(guān)聯(lián),最后得到 7條關(guān)聯(lián)好的數(shù)據(jù)。 237 proc sql inobs=10; 238 create table tmp as 239 select a.*,b.* 240 from March a,Delay b 241 where a.flight=b.flight and a.date=b.date; WARNING: 變量 flight已經(jīng)存在于文件 WORK.TMP 中 中 WARNI

30、NG: 變量 datE經(jīng)存在于文件 WORK.TMP WARNING: 變量 orig已經(jīng)存在于文件 WORK.TMP 中 WARNING: 變量 des已經(jīng)存在于文件 WORK.TMP 中 WARNING: Only 10 records were read from WORK.DELAY (別名 =B ) 由于 INOBS= 選項(xiàng)。 WARNING: Only 10 records were read from WORK.MARCH (別名 =A ) 由于 INOBS= 選項(xiàng)。 NOTE: 表 WORK.TMP 創(chuàng)建完成,有 7 行, 11 列。 1.3 outobs 選項(xiàng) 這個(gè)選項(xiàng)的功能

31、與 inobs 相似,不同的是,這個(gè)選項(xiàng)指定結(jié)果的觀測(cè)值數(shù)量, 而不是讀取源表的數(shù)量, 這在我們控制輸出結(jié)果的數(shù)據(jù)量時(shí)非常有用。 243 proc sql outobs=10; 244 create table tmp1 as 245 select a.*,b.* 246 from March a,Delay b 247 where a.flight=b.flight and a.date=b.date; WARNING:變量“ flight已經(jīng)存在于文件 W0RK.TMP1 中。 WARNING:變量“ date已經(jīng)存在于文件 W0RK.TMP1中。 WARNING:變量“ orig已經(jīng)存在

32、于文件 W0RK.TMP1中。 WARNING:變量“ des已經(jīng)存在于文件 WORK.TMP1中。 WARNING: 語(yǔ)句由于 0UT0BS=10 選項(xiàng)而過早終止。 N0TE: 表 W0RK.TMP1 創(chuàng)建完成,有 10 行,11 列。 1.4 prompt 選項(xiàng) 這里prompt選項(xiàng),可以讓你選擇是否還是按照原來的設(shè)置進(jìn)行動(dòng)作,或者繼續(xù)操作。如下面的日志 所以,如果直接選擇停止,則得到 1 .2的結(jié)果,如果一直按繼續(xù),則得到如下結(jié)果: 255 proc sql inobs=10 prompt; 256 create table tmp3 as 257 select a.*,b.* 258

33、from March a,Delay b 259 where a.flight=b.flight and a.date=b.date; WARNING:變量“ flight已經(jīng)存在于文件 WORK.TMP3 中。 WARNING: 變量“ date已經(jīng)存在于文件 WORK.TMP3 中 WARNING: 變量 orig已經(jīng)存在于文件 WORK.TMP3 中 WARNING: 變量 des已經(jīng)存在于文件 WORK.TMP3 中 NOTE: 表 WORK.TMP3 創(chuàng)建完成,有 19 行, 11 列。 1.5 number 選項(xiàng) proc sql outobs=4 number; select *

34、 from March; quit; 1.6 reset 選項(xiàng) 對(duì)上述SQL語(yǔ)句加上reset選項(xiàng),使其不輸岀序號(hào) proc sql outobs=4 number; reset nonumber; select * from March; quit; 2 DICTIONARY 2.1 DICTIONARY 介紹 DICTIONARY 可以得到很多 SAS 文件和會(huì)話等很多的元數(shù)據(jù), 包括 SAS 文件,外部文件,系統(tǒng)選項(xiàng)、 宏、標(biāo)題、腳注等。 DICTIONARY 是在初始化時(shí)就創(chuàng)建,自動(dòng)更新,并只允許讀取操作,故不能修改。 下面列舉一下 SAS 中 DICTIONARY 所包含的表: SA

35、S V8 DICTIONARY 所包含的表: CATALOGS :SAS 目錄的信息 COLUMNS :SAS 變量和列的信息 EXTFILES :外部數(shù)據(jù)信息 INDEXES :參與索引的列的信息 MACROS :宏相關(guān)信息 MEMBERS :所有數(shù)據(jù)類型(表、視圖、目錄等)的信息 OPTIONS :當(dāng)前會(huì)話選項(xiàng) STYLES : ODS的樣式信息 TABLES :表和數(shù)據(jù)集信息 TITLES :標(biāo)題和腳注信息 VIEWS :視圖信息 SAS V9 DICTIONARY 所包含的新的表: CHECK_CONSTRAINTS :CHECK 約束信息 CONSTRAINT_COLUMN_USAG

36、E :約束列使用信息 CONSTRAINT_TABLE_USAGE :約束表使用 DICTIONARIES :DICTIONARY 所有表及其列 ENGINES :可用的弓I擎 FORMATS :可用的格式 GOPTIONS: SAS/GRAPH 選項(xiàng) LIBNAMES : LIBNAME 信息 REFERENTIAL_CONSTRAINTS :相關(guān)約束 REMEMBER :已記錄的信息 TABLE_CONSTRAINTS :表約束 2.2 查看 2.1 中各表內(nèi)容 查看各表的結(jié)構(gòu),以查看 dictionary.tables 為例: proc sql; describe table dicti

37、onary.tables; quit; 這里可以從日志里看到表 dictionary.tables 的結(jié)構(gòu)。 10 條數(shù)據(jù) 要查看這個(gè)表的數(shù)據(jù),可以通過以下語(yǔ)句實(shí)現(xiàn),這里我們只輸出前 proc sql outobs=10; select * from dictionary.tables; quit; 2.3 使用 DICTIONARY 的信息 查看 SASHELP 庫(kù)里的文件信息: proc sql; options nolabel nocenter; select memname,nobs,nvar,crdate from dictionary.tables where libname=SA

38、SHELP; quit; 注意,這里的庫(kù)名都是大寫。 查看 SASHELP 庫(kù)里有列名為 tabname 的所有表: proc sql; options nolabel nocenter; select memname from dictionary.columns where libname=SASHELP and name=tabname; quit; 注意這里是用 dictionary.columns 的信息 用 SASHELP.VMEMBER 來撮 DICTIONARY.MEMBERS 的信息: proc tabulate data=sashelp.vmember format=8.;

39、 class libname memtype; keylabel N= ; table libname,memtype/rts=10 misstext=None; run; DICTIONARY 是一個(gè)非常有用的信息庫(kù),本文主要是介紹一下其基本功能,以后有時(shí)間的話會(huì)對(duì)其 進(jìn)行詳細(xì)介紹。 3 SQL 過程步與宏語(yǔ)言的交互 SQL過程步可以創(chuàng)建SAS宏變量,也可以生成一些自動(dòng)的宏變量,從其中可以更好地理解SQL處理 過程。 3.1 在 SQL 過程中使用宏變量 %let outputnumber=10; proc sql outobs= options nolabel nocenter; sele

40、ct * from dictionary.tables where libname=SASHELP; quit; 這個(gè)很簡(jiǎn)單,就不講了,下面講一下本節(jié)的重點(diǎn)。 3.2 創(chuàng)建宏變量 SQL 過程步可以通過 into 語(yǔ)句來創(chuàng)建或更新宏變量,主要有三種方式。這里要注意的是,在使用 into 語(yǔ)句創(chuàng)建宏變量時(shí),我們是不能在create table或create view語(yǔ)句里使用的。當(dāng)我們不需要輸岀結(jié)果時(shí), 可以用 noprint 選項(xiàng)。 3.2.1 結(jié)果只有一行 Select col1,col2, In to :mvar1,:mvar2, From 例: proc sql noprint; sel

41、ect avg(sales),min(sales),max(sales) into :mean, :min, :max from sashelp.shoes; quit; %put 這種方式適合輸出結(jié)果只有一行的情況。 3.2.2 提取前 N 行的值 Select a,b, Into :a1-:an, :b1-:bn From N 個(gè)宏變量中 這種方法前前 N 行的查詢結(jié)果輸入到一系列的 例: proc sql noprint; select Region,count(*) as frequency into :Region1-:Region3, :freq1-:freq3 from sash

42、elp.shoes group by Region; quit; %put %put 3.2.3 提取所有數(shù)據(jù) Select col1,col2, Into :macrovarl, :macrovar2, Separated by delimiter From 這里將每列的所有數(shù)據(jù)都輸出到一個(gè)宏變量中,并以指定的分隔符分開。 例: proc sql noprint; select distinct Region into :RegionAll separated by , from sashelp.shoes; quit; %put 3.3 SQL 過程步自動(dòng)產(chǎn)生的宏變量 SQLOBS:記錄輸

43、岀結(jié)果或被刪除的觀測(cè)值個(gè)數(shù) SQLRC:包含每個(gè)SQL語(yǔ)句的返回代碼 SQLOOPS:包含SQL過程步內(nèi)循環(huán)的次數(shù) 例: proc sql; select * from sashelp.shoes; quit; %put 得到輸岀觀測(cè)的條數(shù)。 4 程序測(cè)試與效率 這里主要介紹幾個(gè) SQL 過程步的選項(xiàng): Exec/Noexec:控制SQL語(yǔ)句是否執(zhí)行 Nostimer/Stimer:在SAS日志中報(bào)告每個(gè)SQL語(yǔ)句的效率統(tǒng)計(jì)數(shù)據(jù) Noerrorstop/Errorstop :批處理時(shí)控制當(dāng)有錯(cuò)誤發(fā)生時(shí),是否要檢查語(yǔ)法 例: noexe 與 feedback 66 proc sql feedba

44、ck noexec; 67 select * from sashelp.shoes; NOTE: Statement transforms to: select SHOES.Region, SHOES.Product, SHOES.Subsidiary, SHOES.Stores, SHOES.Sales, SHOES.Inventory, SHOES.Returns from SASHELP.SHOES; NOTE: 由于 NOEXEC 選項(xiàng),未執(zhí)行語(yǔ)句。 68 quit; NOTE: “PROCEDURE SQL所用時(shí)間(總處理時(shí)間) 實(shí)際時(shí)間 0.01 秒 CPU 時(shí)間 0.00 秒 這

45、里我們要注意的是,在比較不同 SQL 語(yǔ)句的效率時(shí),一定要用 CPU 時(shí)間,而不是用實(shí)際時(shí)間,因 為實(shí)際時(shí)間可能會(huì)因運(yùn)行機(jī)器的環(huán)境而有很大的出入。還要注意的是,對(duì)于同一個(gè)數(shù)據(jù)集,在比較效 率時(shí),一定要考慮到該數(shù)據(jù)集第一次運(yùn)行后其排序等已經(jīng)發(fā)生變化,會(huì)對(duì)效率也有影響。 在 SQL 過程步中使用 SAS 數(shù)據(jù)步的選項(xiàng) 在 SQL 過程步中使用 SAS 數(shù)據(jù)步的選項(xiàng) Using Data Set Options in PROC SQL 本文主要講解了在 SQL過程步中使用 SAS數(shù)據(jù)步的選項(xiàng),包括DROP、KEEP、LABEL、COMPRESS、 SORTEDBY 、WHERE 和 RENAME 等

46、,靈活地使用這些選項(xiàng)可以讓我們的SQL 過程步更有效、 更簡(jiǎn) 潔。附錄創(chuàng)建了三個(gè)數(shù)據(jù)集,方便我們進(jìn)行講解。 1 DROP 和 KEEP 在使用用SQL過程步時(shí),我們可以用 select選擇結(jié)果要保留的列,或者用*選擇所有的列。但是如果 我們要選擇除某一兩個(gè)列之外的所有的列,這時(shí)就要使用將其他的列全部都寫一遍,是不是很麻煩。 這時(shí)我們就可以用到DROP來刪除這幾個(gè)不需要的列。例如我們要保留除A1和A3列之外的SCORES 數(shù)據(jù)集中的所有數(shù)據(jù): %let label=Scores Data Set without A1 and A3; proc sql; create table Scores1(

47、label= quit; 此外我們還可以直接在 CREATE TABLE語(yǔ)句后面加上Drop或Keep選項(xiàng)來刪除或保留指定的列: proc sql; create table Scores2(label= quit; 下面一個(gè)例子是用多種方法來實(shí)現(xiàn)保留除 B 開頭以外的所有列: 例 1:這里 KEEP 選項(xiàng)里的 A1-A10 表示了變量范圍,即: A1 到 A10 共 10個(gè)變量。注意這里的- 表示變量范圍,如果在SQL過程步的select語(yǔ)句中,則表示用A1減去A10的值來創(chuàng)建一個(gè)新的變量。 proc sql; create table only_As_1(label=Scores for

48、A Parameters Only) as select * from Scores(keep=Subject_id Visit A1-A10); quit; 例2:這里用-表示名字范圍,B1-B10表示從B1到B10共10個(gè)變量 proc sql; create table only_As_2(label=Scores for A Parameters Only) as select * from Scores(drop=B1-B10); quit; 例3:B:也是名字范圍,指所有以B開頭的變量 proc sql; create table only_As_3(label=Scores fo

49、r A Parameters Only) as select * from Scores(drop= B:); quit; 例4: _numeric_指所有的數(shù)值型變量,與之相對(duì)應(yīng)的是_character_表示所有的字符型變量。 proc sql; create table only_As_4(label=Scores for A Parameters Only) as select * from Scores(keep=Subject_ID _numeric_); quit; 2 LABEL 這個(gè)選項(xiàng)在上面幾個(gè)例子中已經(jīng)講解。 3 COMPRESS COMPRESS主要是用來減少數(shù)據(jù)集的存儲(chǔ)

50、空間,在SQL過程步使用COMPRESS選項(xiàng)進(jìn)行數(shù)據(jù)壓縮 時(shí),我們需要在 CREATE TABLE 語(yǔ)句后要壓縮的數(shù)據(jù)表后面加入該選項(xiàng)。 proc sql; create table only_Bs(compress=yes) as select * from Scores(drop=A1-A10); quit; NOTE: 壓縮的數(shù)據(jù)集 WORK.ONLY_BS 大小減少了百分之 54.85。 壓縮為 484 頁(yè);不壓縮將會(huì)要求 1072 頁(yè)。 NOTE: 表 WORK.ONLY_BS 創(chuàng)建完成,有 60000 行, 12 列。 4 RENAME RENAME 的作用是更改數(shù)據(jù)集的變量的名稱

51、, 例如我們要將 SCROES 中的數(shù)組 A 的所有變量加上前 綴Base,你可以用select語(yǔ)句一個(gè)一個(gè)地更改名字,也可以用rename數(shù)據(jù)步選項(xiàng)。 例:用Select一個(gè)一個(gè)地進(jìn)行更名 proc sql; create table Baseline_A_1 as select subject_id, a1 as base_a1, a10 as base_a10 from Scores where visit=1; quit; 例:用 RENAME 選項(xiàng) proc sql; create table baseline_A_2 as select * from Scores(rename=(

52、a1-a10=base_a1-base_a10) drop=b:) where visit= 1; quit; 注意,這里我們將數(shù)組 A的名字改為以B開頭的變量,而后面一句drop=b:是不是會(huì)把剛才更名完后 的變量也刪除掉。結(jié)果是不會(huì)的,因?yàn)镵eep和Drop選項(xiàng)是在Rename選項(xiàng)之前就執(zhí)行了。 下面來講一個(gè)我們經(jīng)常遇到的情況:兩個(gè)表的內(nèi)連接。例如我們要對(duì)表SCORES和SURGERY進(jìn)行 內(nèi)連接,表SCORES的主鍵為subject_id,而表SURGERY的主鍵為sid,這時(shí),我們一般的內(nèi)連接 語(yǔ)句為: proc sql feedback _method; create table S

53、cores_Surg1 as select * from Scores T1, Surgery T2 where T1.subject_id=T2.sid and T1.visit=T2.visit; quit; 另一種方法就是先將 SURGERY中的sid改名為subject_id,然后運(yùn)用數(shù)據(jù)表的inner join來進(jìn)行數(shù)據(jù) 表的內(nèi)連接: proc sql feedback _method; create table Scores_Surg2 as select * from Scores T1 natural inner join Surgery(rename=(sid=subject

54、_id) T2; quit; 另外,我們還可以遇到列名為 SAS 關(guān)鍵詞時(shí),會(huì)出現(xiàn)一些錯(cuò)誤,例如: proc sql _method; create table caseLT4_1 as select * from Surgery where case lt 4; quit; 這里,where case這一句,SAS會(huì)認(rèn)為這是一個(gè)條件操作的開始(case whenthenend,因此會(huì) 岀現(xiàn)錯(cuò)誤。這時(shí)我們可以先將該列名更名后再進(jìn)行where語(yǔ)句。例如: proc sql _method; create table caseLT4_2 as select * from Surgery(rename=(case=case_id) where case_id lt 4; quit; 這時(shí)case已改名為case_id 5 SORTEDBY 該選項(xiàng)主要指明數(shù)據(jù)集已用哪些變量進(jìn)行排序,這會(huì)增加 SQL 過程步的效率。本人對(duì)該選項(xiàng)用得比 較少,對(duì)效率優(yōu)化也做得比較少,就不再介紹,請(qǐng)大家閱讀相關(guān)文獻(xiàn)。 6 WHERE WHERE選項(xiàng)在SQL過程步中,主要用于取數(shù)據(jù)子集或指定連接條件。Surgery數(shù)據(jù)集中,visit小于 16的客

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論