BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
sskt
Quartz | Level 8

はじめまして。


SAS上でデータステップではなくSQLプロシジャを使うべきところ、とはどこなのでしょうか。
マクロ変数に値を格納したいがcall symputでは無理なパターン以外ではデータステップですべて行けるのではと思ってしまいます。
こういうときはSQLプロシジャのほうが使い勝手が良い、というパターンがあれば教えていただけると幸いです。

 

具体的な質問ではなく申し訳ありませんが、よろしくお願いいたします。

1 ACCEPTED SOLUTION

Accepted Solutions
amatsu
Obsidian | Level 7

 

こんにちは。

 

複雑なデータの結合やグループごとの集計など、データステップが苦手としている処理をSQLプロシジャが得意としているので、そこにうまく入りこませることで簡潔なプログラムを書くことができると思います。

 


私自身は特にグループごとの集計で便利かつスッキリしたプログラムになるのでよく使ってます。

 

手持ちのサンプルデータでは「これぞSQLプロシジャの強み」といういい例がぱっと思い浮かばかったですが、
例えばほんの一例として、
SASHELP.CLASSに格納されているOBS数と、年齢のパターン数を求めたいとします。

 

 

 

通常のデータステップや他のプロシジャを組み合わせると以下のような感じでまどろっこしさを感じます。

 

* OBS数を求める;
proc summary data=sashelp.class;
   output out=out1;
run;

* 年齢のパターン数を求める ;
proc sort data=sashelp.class out=class (keep=age) nodupkey;
   by age;
run;

proc summary data=class;
   output out=out2;
run;
 
data out3;
   merge out1 (keep=_freq_ rename=(_freq_=obs_all))
         out2 (keep=_freq_ rename=(_freq_=obs_age));
run;


しかしSQLプロシジャだと一発ですっきりと書けてしまいます。

 

* OBS数と年齢のパターン数を求める ;
proc sql;
   create table out4 as
   select count(*) as obs_all,
          count(distinct age) as obs_age
   from sashelp.class;
quit;

 

 

View solution in original post

4 REPLIES 4
amatsu
Obsidian | Level 7

 

こんにちは。

 

複雑なデータの結合やグループごとの集計など、データステップが苦手としている処理をSQLプロシジャが得意としているので、そこにうまく入りこませることで簡潔なプログラムを書くことができると思います。

 


私自身は特にグループごとの集計で便利かつスッキリしたプログラムになるのでよく使ってます。

 

手持ちのサンプルデータでは「これぞSQLプロシジャの強み」といういい例がぱっと思い浮かばかったですが、
例えばほんの一例として、
SASHELP.CLASSに格納されているOBS数と、年齢のパターン数を求めたいとします。

 

 

 

通常のデータステップや他のプロシジャを組み合わせると以下のような感じでまどろっこしさを感じます。

 

* OBS数を求める;
proc summary data=sashelp.class;
   output out=out1;
run;

* 年齢のパターン数を求める ;
proc sort data=sashelp.class out=class (keep=age) nodupkey;
   by age;
run;

proc summary data=class;
   output out=out2;
run;
 
data out3;
   merge out1 (keep=_freq_ rename=(_freq_=obs_all))
         out2 (keep=_freq_ rename=(_freq_=obs_age));
run;


しかしSQLプロシジャだと一発ですっきりと書けてしまいます。

 

* OBS数と年齢のパターン数を求める ;
proc sql;
   create table out4 as
   select count(*) as obs_all,
          count(distinct age) as obs_age
   from sashelp.class;
quit;

 

 

sskt
Quartz | Level 8

ご回答ありがとうございます。お三方とも非常に役立つご回答をいただきベストアンサーを迷ったのですが、今回は例をつけてくださりなおかつ一番早かったamatsuさんに差し上げます。
皆様ありがとうございました。

他にもこれはという方がありましたらぜひお聞きしたいので投稿お願いいたします。

katsu
Calcite | Level 5

こんにちは。

 

ユーザーズガイドにて、DATAステップとの違いとして以下のように記述があります。

■SAS® Help Center Comparing PROC SQL with the SAS DATA Step
http://documentation.sas.com/?docsetId=sqlproc&docsetTarget=p015vwpsg8pas3n135iy1t43o1mc.htm&docsetV...
>---(引用)---
PROC SQL can perform some of the operations that areprovided by the DATA step and the PRINT, SORT, and SUMMARY procedures.
--
PROC SQL can achieve the same results as Base SAS software but oftenwith fewer and shorter statements.
>------------

 

上記サイトでも例示がありますが、amatsu さんの回答のようにシンプルにできる、が大きいと思います。


私見で恐縮ですが、VIEW作成などのSQLプロシジャの機能を使う必要がない(データの取得/編集のみ)において
SASプログラマでない人がコードを読んだり書いたりする必要があるケースでは
あえてDATAステップでなくSQLプロシジャを利用することが有益な場合があるかと理解しています。

 

 

上記の他に1点、同ドキュメントで
sashelp.vtableなど、Dictionaryテーブルを参照する場合にはSQLプロシジャがより効率的であると記載されています。


via.■SAS® Help Center Accessing SAS Information By Using DICTIONARY Tables
http://documentation.sas.com/?docsetId=sqlproc&docsetTarget=n02s19q65mw08gn140bwfdh7spx7.htm&docsetV...
>DICTIONARY Tables and Performance
>---(引用)---
When querying a DICTIONARY table, SASlaunches a discovery process that gathers information that is pertinentto that table.
Depending on the DICTIONARY table that is being queried,this discovery process can search libraries, open tables, and executeviews.
Unlike other SAS procedures and the DATA step, PROC SQL canmitigate this process by optimizing the query before the discoveryprocess is launched.
Therefore, although it is possible to access DICTIONARY table information with SAS procedures or the DATA stepby using the Sashelp views,
it is often more efficient to use PROCSQL instead.
>------------


ご参考になれば。

 

yu_sas
SAS Employee

活発な議論ありがとうございます。興味深いテーマですね。

以下のブログでは、二つの機能を買い物の方法に例えて対比し説明しています。

結論はすでにお二方が記載されたものと同様ですが補足になればと思います。

 

Five reasons to use the SAS DATA Step or PROC SQL

 

DATAステップにはハッシュのような重要な機能もあります。一方で、リレーショナル

データベースを利用しているのであれば、SQLプロシジャのパススルー機能もあります。

目的に対し、簡潔に記述できるかや有益な機能を持っているか等で使い分けするのも

一案かと思います。