SQLプロシジャ その2(Create文)
久しぶりに更新してみようとおもいます。
今回は以前の記事で紹介すると記載していた
select文で絞り込んだデータをアウトプット画面に出力するだけではなく、
データセットとして出力する方法をご紹介しようと思います。
と言っても方法はとても簡単です!
select文の前にcreate table文を追記するだけで良いのです!!
では、実際にどんな感じかといいますと・・・
とても簡単じゃないですか!?
では例文で具体的に記載してみます。
とこんな感じで記載すればOK!
どのようなデータセットが出来上がるかというと・・・
DS1:
DS2:
とこのように既存テーブル「DS1」からselect文で条件を絞った
テーブル「DS2」を生成できてしまいます!
やっぱりSQLはとても便利です。
SQLの使い勝手は抜群で!様々な事ができます。
(しかも簡単に!data文よりもeasy)
なので、また次回記事でも(多分)紹介したいと思います!
ただし、実務的な話をするとSQL文はパフォーマンス悪めです・・・
(特にsortとか・・・)
SQLプロシジャ その1(select句)
ちょっとしたデータ加工やデータの結合など、
dataステップで面倒な処理でも簡単にできてしまうのがSQLプロシジャのメリットです。
SQLに慣れ親しんでいる方にとっても、SASでSQLを使えるのは嬉しい点ですよね。
(私もSASの勉強しはじめの頃は、SASでもSQLが使える!と知って少しうれしかった気が…。)
◎SELECT句
選択した変数をOUTPUTに出力できます。
例)
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
DS1からSQL文で指定したA列のみを抽出することができます。
◎ORDER BY句、WHERE句
もちろん並び替えや抽出もできます。
先ほどのDS1のデータのソートをすることもできます。
もちろん、where文で条件を指定して
対象のレコードのみを抽出することも可能です。
上記の処理のみでは、これらの抽出したデータは
output画面に表示されているだけです。
実際にデータセットとして活用するためには
ちょっとした処理が必要となります。
それは・・・
create table文を使うと簡単に生成できます。
それはまた別記事で〜〜
SASでも条件分岐を1行でできる!ifn関数、ifc関数
条件によってある変数に異なった処理をしたいときに
excelやC#のような
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は数値変数となります!
○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は文字変数となります!
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. ; /* ログ画面に取得したパスを試しに出力 */
あれこれやって試すのは楽しいですね!笑
日々気づいたこと・気になった内容をあげていますが、なかなか難しいです。。。
(記事募集・・・)