2011年9月27日

SAS PROC SQL入門 (Part A)


本篇應該是SAS PROC SQL的入門吧?哈~ ╯﹏╰
這在裡不會產生新的資料(Data),只介紹直接在報表中呈現結果,往下看就可以理解了。

PS:此篇 SQL入門介紹,在2008年就寫好了,有點不確定當初寫這一篇的目的,不過寫都寫了,就與大家分享 ^.^。  


PROC SQL指令介紹: PROC SQL常用的指令表列

PROC SQL 選項 ;
     CREATE 表格名稱 AS
     SELECT 變項(直行)
     FROM 表格名稱(資料檔名稱)
     WHERE 條件
     GROUP BY變項
     HAVING條件
     ORDER BY 變項 ;
QUIT ;



在開始之前:
在開始之前需要建立一個範例資料檔。
  

DATA Heart ;
SET Sashelp.Heart (obs=20);
Height=Height*2.54;
Weight=Weight*0.454;
KEEP Status Sex AgeAtStart Height Weight  Diastolic Systolic Smoking;
run;


入門的第一步:
第一步為列出特定資料檔中所有變項的值,如同PROC PRINT一般。
在SELECT後面加「星號」,代表需要列出選取資料檔所有的變項(直行)的資料。而FROM為表示要由那個「表格(Table)」或習慣稱為「資料檔(Data)」抓取所需的資料,結果列於《圖01》。
PROC SQL;
SELECT *
FROM Heart;
QUIT;
 SQL1-01 《圖01》


只選取部分變項:
如同RPCO PRINT可以透過VAR指令只選出想要表列的結果,在PROC SQL語法中,只要於SELECT後面敘述想呈現的變項即可,例如只選取Height和Weight。結果於《圖02》。
PROC SQL;
SELECT Height, Weight
FROM Heart;
QUIT;
 SQL1-02
《圖02》


建立新變項 (基本方法) …01:
在原本DATA step函數除了幾個特殊的函數外(DIFF、LAG等),大多數均可以在PROC SQL指令中使用,在SELECT敘述後直接針對變項做運算或使用函數可建立新的變項,例如建立『Height/100』,如果無在新變項後面使用AS這個指令,新變項將會無變項名稱。結果如《圖03》。
PROC SQL;
SELECT Height/100 , Weight/(Height/100)**2 AS BMI
FROM Heart;
QUIT;
 SQL1-03
《圖03》


建立新變項 (CALCULATED指令)…02:
在上面的例子中可以發現,在計算BMI時『Height/100』似乎被重複使用到了,雖然在新的程式中將『Height/100』命為『Height_m』,但我們還不能馬上使用此新變項,除非在新變項前面增加CALCULATED指令,結果於《圖04》。(用法:CALCULATED 新變項)
PROC SQL;
SELECT Height/100 AS Height_m , 
            Weight/ (CALCULATED Height_m**2) AS BMI
FROM Heart;
QUIT;
 SQL1-04
《圖04》


建立新變項 (變項分組)…03:
在建立資料的時候,依據條件將變項重新分組,是常見到的過程,在DATA step中我們會使用IF…THEN…ELSE將變項重新分組,類似的指令在PROC SQL中使用的是下列的指令。
CASE
      WHEN 條件1 THEN 結果1
      WHEN 條件2 THEN 結果2
      ELSE結果
END AS 新變項
在資料中當身高(Height) <160、160~170和≧170的分為三組,並新增一個變項Height_gr將三組身高依序命名為1、2和3,結果如《圖05》。
PROC SQL;
SELECT ID,Height,
    CASE
       WHEN 0<=Height<160 THEN 1
       WHEN Height<170 THEN 2
       WHEN Height>=170 THEN 3
       ELSE .
    END AS Height_gr
FROM Heart;
QUIT;
 SQL1-05
《圖05》


只呈現符合特定條件的資料:
在呈現資料的時候,可能只想呈現年齡≦35歲的資料,這時WHERE指令即可達到我們的目的,結果於《圖06》。
PROC SQL;
SELECT *
FROM Heart
WHERE AgeAtStart<=35;
QUIT;
SQL1-06 
《圖06》


計算分組變項的統計量:
如果要計算分組統計量我們除了使用PROC MEANS程序外,在PROC SQL程序中,可以使用GROUP BY這個指令,及在SELECT指令中配合計算統計量的函數(例如:MEAN、STD、COUNT、MAX、MIN、NMISS、STD、SUM和VAR),可達到類似的結果。在以下程式中,產生了年齡分群的變項「age_gr」,此變項將年齡分為<40和>=40兩組,然後將「age_gr」變項置於GROUP BY後面,即可依據年齡分群的結果計算統計量,其結果如《圖07》。
PROC SQL;
SELECT MEAN(Weight) as Weight_m, STD(Weight) as Weight_STD,
            MEAN(Height) as Height_m, STD(Height) as Height_STD,
            CASE
                 WHEN 0<=AgeAtStart<40 THEN "年齡<40"
                 WHEN AgeAtStart>=40 THEN "年齡≧40"
                 ELSE ""
            END AS age_gr
FROM Heart
GROUP BY age_gr;
QUIT;
 SQL1-07
《圖07》


如果您覺得這篇文章對您有幫助,文章旁的廣告您也剛好有興趣,請幫忙點擊廣告,讓我多一點寫下去的動力。感謝您的幫忙!


參考文章:
1. Katie Minten Ronk, Steve First, David Beam. An Introduction To PROC SQL. SUGI 27.
2. Kirsty Lauderdale. PROC SQL - The Dark Side of SAS? SAS Global Forum 2007.
如有誤請指教。轉載請註明來源。

系列文章:

3 則留言:

  1. 您好:我是sas剛入門新手,想請教您,我在做垂直合併時,發生有個變數類別訂不同(一個number 一個文字),出現error,請問這應該如何處理?謝謝
    我有試著先把A檔的變數改為文字,用length,但還是不行,我的程式碼如下 A檔變數a1是number
    Data temp;
    Set A;
    Iength a1 $ 12;
    Run;

    回覆刪除
  2. 用看看input()字符轉數值或是put()數值轉字符,格式一樣後再來merge(記得用來merge的變量要先sort排序過喔)~

    回覆刪除
  3. merge 使用proc sql就不用sort了~

    回覆刪除