2014年5月16日金曜日

SQLプロシジャ入門6:データセットを作成する【CREATE TABLE】


まだあとちょっと続きます。
しかし今回までの基礎を身につければかなり役に立つと思います。

今回はSQLの結果をデータセットに出力する方法です。



サンプルデータ
data DT1;
input A B;
cards;
1 10
1 15
2 20
2 10
;
 A 
B
  1  
  10   
  1
  15  
  2  
  20   
  2  
  10   




結果をデータセットに出力する。[CREATE TABLE]
proc sql;
   create table  DT2  as
   select *
   from DT1;
quit;



 A 
B
  1  
  10   
  1
  15  
  2  
  20   
  2  
  10   


解説
「CREATE TABLE 出力データセット名 AS」 で結果をデータセットに出力します。





SQLプロシジャ入門記事一覧
1.変数を選択する【SELECT】
2.レコードを並べ替える【ORDER BY】
6.データセットを作成する【CREATE TABLE】

2014年5月13日火曜日

CONTENTS,DELETEプロシジャでは「ライブラリ名._ALL_」という書き方が出来る。



CONTENTSとDELETEプロシジャでは「DATA = ライブラリ名._ALL_」という書き方があるのをご存知でしょうか。
どういったものか、例をみていきましょう。



使用するダミーデータを作成

data DT1 DT2 DT3;
  A=1;
run;



「ライブラリ名._ALL_」と指定してみる

*** 1. CONTENTSプロシジャの例 ;
proc contents data=WORK._ALL_ out=OUTC  noprint;
run;

・指定したライブラリにある全てのデータセットとVIEWのコンテンツ情報を取得して、データセットに出力することが可能。



*** 2. DELETEプロシジャの例 ;
proc delete  data=WORK._ALL_;
run;

・指定したライブラリにある全データセットを削除することが可能。





2014年5月7日水曜日

SQLプロシジャ入門5:集計後にレコードを抽出する【HAVING】



5回目はHAVINGです。
WHEREと同じでレコードを抽出する機能なんだけど、抽出するタイミングが異なります。




サンプルデータ
data EXAM;
input NAME$ SUBJECT$ SCORE FLG;
cards;
一郎 国語 20 .
次郎 国語 50 .
三郎 国語 100 1
花子 国語 20 .
一郎 算数 80 .
次郎 算数 30 .
三郎 算数 10 1
花子 算数 99 .
;

NAME
SUBJECT
SCORE
FLG
 一郎  
 国語   
 20  
  .  
 次郎  
 国語   
 50
  .  
 三郎
 国語   
 100  
  1  
 花子  
 国語   
 20  
  .  
 一郎  
 算数   
 80  
  .  
 次郎  
 算数   
 30  
  .  
 三郎
 算数   
 10  
  1  
 花子
 算数   
 99  
  .  

上の例は、各生徒の科目別テストの点数を表してます。
ただし、カンニングした生徒(FLG=1)がいる。




1. 点数が50点未満のレコードを抽出する【HAVING】
proc sql;
   select  *
   from  EXAM
   having  SCORE < 50 ;
quit;


結果ビューア
 NAME 
SUBJECT
SCORE
FLG
 一郎  
 国語   
 20  
  .  
 花子  
 国語   
 20  
  .  
 次郎  
 算数   
 30  
  .  
 三郎
 算数   
 10  
  1  


解説
・HAVINGで抽出条件を指定。
・この例ではWHEREと同じに見えてしまうけど、違いは以下の通り。

  WHERE ・・・ FROMで指定したデータに対する抽出条件
  HAVING ・・・ 集計後のレコードへの抽出条件

具体例は次の例で。



2. 平均が50点未満の科目を調べたい(ただしカンニングした点数は含めない)
【WHERE、GROUP BY、HAVING】
proc sql;
   select     SUBJECT,  avg(SCORE) as AVG_SCORE
   from        EXAM
   where      FLG = .
   group by  SUBJECT
   having     AVG_SCORE < 50 ;
quit;

結果ビューア
SUBJECT
AVG_SCORE
 国語   
 30  


解説
・SELECTにあるAVG関数は平均を求める集計関数。
・具体的な各句の役割は以下の通り。

 ①FROMとWHEREで、データEXAMからカンニングしてないレコードを抽出
 ②SELECTとGROUP BYにより、科目毎の平均点を計算
 ③HAVINGを使って、科目毎の平均点が50点未満のレコードを抽出


このようにグループ化して集計を行ったデータに対して抽出が行えます。




SQLプロシジャ入門記事一覧
1.変数を選択する【SELECT】
2.レコードを並べ替える【ORDER BY】
4.グループ毎に集計する【GROUP BY】
5.集計後にレコードを抽出する【HAVING】
6.データセットを作成する【CREATE TABLE】
7.レコードを追加する【INSERT】
8.レコードを削除する【DELETE】

2014年4月28日月曜日

MEANSプロシジャで結果ビューアに出る結果と同じ形のデータセットを作る。



SAS9.3からMEANSプロシジャに「STACKODSOUTPUT (STACKODS でも可)」というオプションが追加されました。
これは結果ビューアの出力と似た形のデータセットを作ることが出来るオプションです。




サンプルデータ作成

data DT1;
input SEX  HEI  WEI;
cards;
1 165 70
1 155 50
2 160 40
2 150 50
2 149 60
;




3つのデータセット出力方法

STACKODSとそれ以外の出力方法もあわせて紹介していきます。


方法1 ・・・ OUTPUTステートメント
proc means data=DT1 n mean  nway;
   var  HEI  WEI;
   class  SEX / missing;
   output  out=SUM  n= mean= / autoname;
run;

データセットSUM
SEX _TYPE_ _FREQ_ HEI_N WEI_N HEI_Mean WEI_Mean
1 1 2 2 2 160 60
2 1 3 3 3 153 50



方法2 ・・・ ODS OUTPUT
ods output summary=SUM2;
proc means data=DT1 n mean  nway;
   var  HEI  WEI;
   class  SEX / missing ;
run;
ods output close;

データセットSUM2
SEX  NObs VName_HEI  HEI_N  HEI_Mean  VName_WEI  WEI_N  WEI_Mean 
1 2 HEI 2 160 WEI 2 60
2 3 HEI 3 153 WEI 3 50



方法3 ・・・ ODS OUTPUTとSTACKODSの組み合わせ (SAS9.3から)
ods output summary=SUM3;
proc means data=DT1 n mean  nway  STACKODS ;
   var  HEI  WEI;
   class  SEX / missing ;
run;
ods output close;

結果ビューアの出力











データセットSUM3
SEX NObs _control_ Variable N Mean
1 2 HEI 2 160.000000
1 2 WEI 2 60.000000
2 3 1 HEI 3 153.000000
2 3 WEI 3 50.000000




要望としては、将来他のプロシジャでも対応してほしいですね。
FREQプロシジャとか。。

2014年4月23日水曜日

SQLプロシジャ入門4:グループ毎に集計する【GROUP BY】





4回目はいよいよSQLの得意技であるGROUP BYによるグループ毎の集計について。



サンプルデータ
data DT1;
input A B;
cards;
1 10
1 15
1 20
1 .
2 10
2 15
;

 A 
B
  1  
  10   
  1
  15  
  1
  20 
  1
  .  
  2
  10  
  2
  15 




グループ毎に集計して出力する。[GROUP BY]
proc sql;
   select A ,
            count(B)  as _N  ,
            nmiss(B)  as _MISS  ,
            sum(B)    as _SUM  ,
            min(B)     as _MIN  ,
            max(B)    as _MAX
   from DT1
   group by A;
quit;


結果ビューア
 A 
 _N 
 _MISS 
_SUM 
_MIN 
_MAX 
  1  
  3 
  1 
  45 
  10 
  20 
  2  
  2 
  0 
  25 
  10 
  15 


解説
・まずGROUP BYにグループ化したい変数を指定する。
同じ変数をSELECTにも指定します。

・グループ毎にどの変数にどんな集計をしたいか、SQL用の集計関数をSELECTに記述する。


SQL集計関数は
  COUNT ・・・NULL以外の数
  NMISS  ・・・NULLの数
  SUM     ・・・合計
  MIN      ・・・最小値
  MAX     ・・・最大値
  AVG     ・・・平均値
などがあり、ほかにも簡単な要約統計量を求める関数がいくつかあります。




SQLプロシジャ入門記事一覧
1.変数を選択する【SELECT】
2.レコードを並べ替える【ORDER BY】
4.グループ毎に集計する【GROUP BY】

2014年4月22日火曜日

SQLプロシジャ入門3:レコードを抽出する【WHERE】



3回目はWHEREによるレコードの抽出方法について。



サンプルデータ

data DT1;
  A=2; B="c"; output;
  A=1; B="b"; output;
  A=2; B="a"; output;
run;

 A 
B
  2  
  c   
  1
  b  
  2
  a  


構文

1. レコードを抽出して出力する。[WHERE]
proc sql;
   select *
   from DT1
   where A=2 ;
quit;


結果ビューア
 A 
B
  2  
  c  
  2
  a  


解説
・WHEREでレコードの抽出条件を指定。



2. ここまでのおさらい問題・・・レコードの抽出と並べ替え。[WHERE、ORDER BY]
proc sql;
   select *
   from DT1
   where A=2 
   order by B ;
quit;

結果ビューア
 A 
B
  2  
  a 
  2
  c  


解説
・WHEREでレコードを抽出し、ORDER BYでレコードを並び替える。




SQLプロシジャ入門記事一覧

1.変数を選択する【SELECT】
2.レコードを並べ替える【ORDER BY】

2014年4月18日金曜日

SQLプロシジャ入門2:レコードを並べ替える【ORDER BY】


2回目はレコードの並び替えについて。


サンプルデータ

data DT1;
  A=2; B="a"; output;
  A=1; B="b"; output;
  A=2; B="c"; output;
run;


 A 
B
  2  
  a   
  1
  b  
  2
  c  



構文

1. レコードを並び替えて出力する。[ORDER BY]
proc sql;
   select *
   from DT1
   order by A, B ;
quit;


結果ビューア
 A 
B
  1  
  b   
  2
  a  
  2
  c  


解説
・ORDER BYで指定した変数の順で行を並び替える。



2. レコードを降順に並び替えて出力する。[ORDER BY ● DESC]
proc sql;
   select *
   from DT1
   order by B  desc;
quit;


結果ビューア
 A 
B
  2  
  c   
  1
  b  
  2
  a  


解説
・ORDER BYでDESCを指定した変数は降順で並び替えられる。



SQLプロシジャ入門記事一覧

1.変数を選択する【SELECT】
2.レコードを並べ替える【ORDER BY】
3.レコードを抽出する【WHERE】
4.グループ毎に集計する【GROUP BY】
5.集計後にレコードを抽出する【HAVING】
6.データセットを作成する【CREATE TABLE】
7.レコードを追加する【INSERT】
8.レコードを削除する【DELETE】