OL、SEになる!おぼえがき★

関西人OL。SEの技術力獲得のためのおぼえがきまとめです!

SQLプロシジャ その2(Create文)

久しぶりに更新してみようとおもいます。

 

 

今回は以前の記事で紹介すると記載していた

select文で絞り込んだデータをアウトプット画面に出力するだけではなく、

データセットとして出力する方法をご紹介しようと思います。

 

 

と言っても方法はとても簡単です!

select文の前にcreate table文を追記するだけで良いのです!!

  

では、実際にどんな感じかといいますと・・・

 

 proc sql ;

 create table 作成するテーブル名 as

   select文 ;

 quit ;

 

とても簡単じゃないですか!?

では例文で具体的に記載してみます。

 

 proc sql ;

 create table DS2 as

 select *

 from DS1

 where A2 > 12 ;

 quit ;

 

とこんな感じで記載すればOK!

どのようなデータセットが出来上がるかというと・・・

 

DS1:

f:id:omihosam:20180807234110p:plain

DS2:

f:id:omihosam:20180807234130p:plain

 

とこのように既存テーブル「DS1」からselect文で条件を絞った

テーブル「DS2」を生成できてしまいます!

やっぱりSQLはとても便利です。

 

SQLの使い勝手は抜群で!様々な事ができます。

(しかも簡単に!data文よりもeasy)

 

なので、また次回記事でも(多分)紹介したいと思います!

ただし、実務的な話をするとSQL文はパフォーマンス悪めです・・・

(特にsortとか・・・)

 

 

SQLプロシジャ その1(select句)

SASでもSQLを使うことができます。

ちょっとしたデータ加工やデータの結合など、
dataステップで面倒な処理でも簡単にできてしまうのがSQLプロシジャのメリットです。

SQLに慣れ親しんでいる方にとっても、SASSQLを使えるのは嬉しい点ですよね。
(私もSASの勉強しはじめの頃は、SASでもSQLが使える!と知って少しうれしかった気が…。)

 

 proc sql ;

   SQL文;

 run ;

 

◎SELECT句 

 選択した変数をOUTPUTに出力できます。

 

 proc sql ;

    select * (出力したい変数名or全て)

    from Dataset ;

 quit ;

    セミコロンはSQL文の最後にひとつだけ

 

 例)

 data DS1 ;  

   A1 = "aaa" ; A2 = 10 ; output ;

   A1 = "bbb" ; A2 = 13 ; output ;

   A1 = "ddd" ; A2 = 14 ; output ;

   A1 = "ccc" ; A2 = 12 ; output ;

 run ;  

   

 proc sql ;

    select A1

    from DS1;

 quit ;

 

DS1

f:id:omihosam:20170912185135p:plain

 

DS1からSQL文で指定したA列のみを抽出することができます。

f:id:omihosam:20170912185225p:plain

 

 ◎ORDER BY句、WHERE句

 もちろん並び替えや抽出もできます。

 

 proc sql ;

    select *

    from DS1;

    order by A2, A1 ;

 quit ;

 

 

先ほどのDS1のデータのソートをすることもできます。

 f:id:omihosam:20170912185702p:plain

 

 proc sql ;

    select *

    from DS1;

    where A2 > 12 ;

 quit ;

 

 

もちろん、where文で条件を指定して

対象のレコードのみを抽出することも可能です。

f:id:omihosam:20170912185753p:plain

 

 

上記の処理のみでは、これらの抽出したデータは

output画面に表示されているだけです。

 

実際にデータセットとして活用するためには

ちょっとした処理が必要となります。

 

それは・・・

create table文を使うと簡単に生成できます。

 

それはまた別記事で〜〜

 

 

 

SASでも条件分岐を1行でできる!ifn関数、ifc関数

条件によってある変数に異なった処理をしたいときに
excelC#のような

if(条件,trueの場合の処理,falseの場合の処理) 

といった記載が
できないかなーと探していてやっぱり見つけたので備忘録として記載。


◆構文

 ifn(条件式, 条件式がtrueの場合に返される数値定数、変数、式, 条件式がfalseの場合に返される数値定数、変数、式)   

 ifc(条件式, 条件式がtrueの場合に返される数値定数、変数、式, 条件式がfalseの場合に返される数値定数、変数、式)   



IFN関数は数値を、IFC関数は文字値を返します。

これまではたらたらと以下のように長くかいていました。

   if 条件式 then do ;

    trueの処理 ;

  end ;

  else do ;

    falseの処理 ;

  end ;

それが・・・

ifn(条件式, trueの処理, falseの処理)      

ifc(条件式, trueの処理, falseの処理)      

 

とコンパクトに!!便利ですね。。

SAS 基礎 INPUT関数のおまけ (無効なデータという旨のNOTEを消す方法)

文字→数値とするとき無効な数字(数字にできないもの 例:文字)があるとログにNOTEが出力され欠損値がいれられます

 data test3 ;

   a = '100' ;

   b = '17Jan2017' ;

   c = '1a' ;

   num_a = input(a, best12.) ;

   num_b = input(b, date9.) ;

   num_c = input(c, best12.) ;

 run ;

 

NOTE: 関数INPUT(行 76 カラム 13)の引数は無効です。
a=100 b=17Jan2017 c=1a num_a=100 num_b=20836 num_c=. _ERROR_=1 _N_=1
NOTE: 以下の箇所で演算式を計算できなかったため、結果を欠損値に設定しました。



このNOTEを出力しない方法があるんです!それは・・・

 data test3 ;

   a = '100' ;

   b = '17Jan2017' ;

   c = '1a' ;

   num_a = input(a, best12.) ;

   num_b = input(b, date9.) ;

   num_c = input(c, ?? best12.) ;

 run ;

 

input(対象の変数, ?? フォーマット)


とするとNOTEが出力されなくなります。(欠損値が入るのは変化しません)
使う用途によってはおすすめです!



SAS 基礎 INPUT関数、PUT関数

INPUT関数、PUT関数のまとめ☆

文字値から数値、数値から文字値への変換を行う関数 です。

     input:文字値→数値
     put :数値→文字値 

 

◆使い方(構文)
input(対象の変数, フォーマット)
put(対象の変数, フォーマット)


◆例
○input
・【best12.】:文字値を数値に
・【date9.】:文字値(ddmmmyyyy)を日付(数値)に

 data test1 ;

   a = '100' ;

   b = '17Jan2017' ;

   num_a = input(a, best12.) ;

   num_b = input(b, date9.) ;

 run ;

 

とするとa,bは文字変数、num_a, num_bは数値変数となります!

f:id:omihosam:20170415131821p:plain

f:id:omihosam:20170415131832p:plain

 

○put
・【best12.】:数値を文字値に
・【date9.】:日付(数値)を文字値(ddmmmyyyy)に

 data test2 ;

   a = 100 ;

   b = 20836 ;

   chr_a = put(a, best12.) ;

   chr_b = put(b, date9.) ;

   chr_a = put(a, best12.) ;

 run ;

 

とするとa,bは数値変数、num_a, num_bは文字変数となります!

f:id:omihosam:20170415131920p:plain

f:id:omihosam:20170415131927p:plain

 

SAS 基礎 カレントディレクトリ パス取得方法

 

SASでカレントディレクトリのパスを取得する方法をご紹介!

なかなか探してもでてこなかったので覚書で記載します。

 

 

まず、"filename" を利用して、カレントディレクトリをmydirとして定義します。

その後、"pathname"を利用して、fnameという変数に、mydirの値、つまりカレントディレクトリのパスの値を格納します。

これで終わりです。

 

 FILENAME mydir "." ;            /*カレントディレクトリをmydirとして定義*?      

   

 data _null_ ;

   length fname $100 ;

   fname = pathname ("mydir") ;  /*パスの取得*/        

   put fname = ;                 /*ログウィンドウへパスを出力*/   

 run ;

   

 

上記を実行すると、putでfnameの値をログに出力するようにしているので、

ログの中で、パスが取得できていることを確認することができます!!

 

 

応用編としては、Xコマンドを使って、違うディレクトリへと移動し、そのパスを取得することもできます。

Xコマンドを使用する場合は以下のように利用します。

 

X "cd c:\user¥temp\XXXX"; 
filename mydir ".";

 

 

また取得したパスを利用したい場合は、例えばマクロ等を利用すれば簡単にできます。


%macro current ;
%global path1 ;
%let path1 = ;

filename mydir ".";

data _null_ ;
path1 = pathname("mydir") ; 
run ;

%mend ;
%current ;

%put &path1. ; /* ログ画面に取得したパスを試しに出力 */

 

 

あれこれやって試すのは楽しいですね!笑

日々気づいたこと・気になった内容をあげていますが、なかなか難しいです。。。

(記事募集・・・)