ラベル プロシジャ:SQL の投稿を表示しています。 すべての投稿を表示
ラベル プロシジャ:SQL の投稿を表示しています。 すべての投稿を表示

SQLでフォーマットとかラベルとかを消す場合のちょっと変わった書き方の話とか

脈絡のない話をいくつか。


最近、SAS友のコードレビューしていて、ん??と思ったのが

proc sql noprint;
create table B as
select X + 0 as X
      ,Y||'' as Y
from A;
quit;

っていうコード(ほんとはもっと処理が入りますが、単純化しています)。

意図わかります?一瞬、なにがしたいんだ?ってなりません?

実はこれ、SQLでデータ元の変数をそのまま参照したいけど、それに定義されているフォーマットやラベルは
初期化したいという意図があるんですね。

ためしに

data A;
X=1;Y='A';
label X='ラベルX' Y='ラベルY';
format X yymmdds10.;
run;








としてから、上のコードを実行すると確かにラベルとフォーマットが消えていることが確認できます。







もちろん

proc sql noprint;
create table _B as
select X format=best. label=''
      ,Y label=''
from A;
quit;

こうしてもいいんだけど、そうやって書き連ねるより楽だし、このことを知っていれば、初期化してるんだって
わかりやすいですね。

ちなみにデータステップで

data C;
set A;
X=X+0;
Y=Y||'';
run;

としてもXとYは元の変数を引き継いでしまうんですね。盲点といえば盲点かも。


ちなみにちなみに、もしデータセットを新規に作らずにフォーマットやラベルを変更する場合、よく
proc datasets;でmodifyを使うと思いますが、

SQLならalter文で書けます。(あんまりSASでalter文を書く必然性がなかったから書いたことないけど)

proc sql noprint;
alter table A 
modify X format=best. label='';
quit;


続いての話題、SAS忘備録のSQL入門がシリーズ15回までいって、とりあえず終了予定だそうです
このシリーズは必読物です。勉強になるし、わかりやすい!特にSASで初めてSQLに触れる方は必読です。
で、最後に僕のブログの書籍紹介にリンクを貼っていただいていているのですが、そこに1冊追加です

「プログラマのためのSQL 第4版 すべてを知り尽くしたいあなたに」
Joe Celko (著), ミック (翻訳, 監修)
出版社: 翔泳社; 2013/5/23

タイトルにグッときたら買いでしょう。それが全てを物語っています。

あと、日本のSQLをひっぱるミックさんがまた最近本をだされて
「SQL実践入門──高速でわかりやすいクエリの書き方」
っていうのを、今読もうとしています。

はい、それだけです。


続いての話題、
SASプログラマーなら必ず一度はお世話になっているはずのサイト「SAS統計データ解析入門
ですが、そちらの管理人さんが海外赴任される等の諸事情で、サイトを更新していきたいのに中々できなくてジレンマを感じている。できればSASの普及に意欲のある方でサイトを引き継ぎたいという方がいればお願いしたいというご相談を受けました。
最初、僕が引き継がせていただこうかとも思ったのですが、まあ、僕のブログは知っての通り、一部のマニア向けなもので、僕はそういうのしか書けないことを見抜かれて、やんわり断っていただきました。

なので、「SAS統計データ解析入門」のテイストを愛しつつ、ぜひ後を継ぎたいという方は、サイトの掲載のメールアドレスか、僕の方にご連絡ください。

続いての話題、
今年もSASユーザー総会の季節がやってきます

2日間にわたって行われるSASユーザーのお祭りで、参加費も安い!
一般:5,400円(税込)
教育機関/公的研究機関:2,700円(税込)
学生:1,100円(税込)

しかし、さらにお得に、参加費を無料にして、論文集もタダで貰え
懇親会でタダ飯を食べることができる裏ワザがあります。

そうです、自分で論文かプレゼンテーション、ポスター・セッションを投稿して発表すればいいんです!
僕も恐らくまた投稿すると思います。
毎年常連の方の発表もいいんですが、やっぱり色んな分野の新しい人の発表を聞いてみたいです。

以上、脈絡のない話でした。


ビューの生成コードを出力するdescribeについて、SQLビューとデータステップビューだと方法が違うから気を付けてって話

さて、以前、SASのビューについて説明したことがありました。

「SASのテーブルビュー(view)について」
http://sas-tumesas.blogspot.jp/2013/12/sasview.html


おさらいとして、

data Q1;
 do X= 1 to 10;
output;
 end;
run;

というデータセットが実体としてあった場合、
Xが偶数のもののみに絞るビューは、以下の2種類の方法で書くことができます。

proc sql noprint;
 create view V1 as
  select *
from Q1
where mod(X,2) = 0;
quit;


data V2/view=V2;
set Q1;
where mod(X,2)=0;
run;











SQLプロシジャのcreate viewか、dataステートメントのviewオプションいずれで
作っても、結果作成される2つのビューの挙動は同じです。

しかし、例えば、contentsプロシジャでビューを見てみると

proc contents data = V1;
run;
proc contents data = V2;
run;

V1の方は





エンジン (ENGINE)           SQLVIEW

とでて、
V2の方は





エンジン (ENGINE)           SASDSV

となって、ビューはビューでも一応種類が違うことがわかります。
要するに、ビューが参照されるときに内部的に実行されるコードが、データステップなのか
SQLなのかってことですね。

この違いについて、ビューのユーザーは基本的に特に何も意識せずともいいのですが、少しだけ
注意があります。

それは、そのビューがどういった定義で生成されたものなのかを確認するとき、
SQLビューに対しては

proc sql;
describe view V1;
quit;

としなければならず、
SASデータセットビューに対しては

data view=V2;
   describe;
run;

としなければならないというルールです。

例えばSQLビューに対して

data view=V1;
   describe;
run;

とすると
ERROR: ビュー WORK.V1 は壊れているか、
       または DATA ステップビューではありません。

と弾かれ、逆にSASデータセットビューに対して
proc sql;
describe view V2;
quit;
とすると
WARNING: WORK.V2 は SQL ビューではありません
と弾かれます。

この、スタンドはスタンドでしか攻撃できないみたいなルールについて
知っていればどうってことないのですが、知らない場合、
特にデータセットビューは知ってるけどSQLビューって何?みたいに片方しか把握してない
メンバーが混在して仕事をする時に、問題になったという体験談を聞いたことがあります。
なんか、てっきり壊れてると思って、他の人が作ったビュー、全部消しちゃったとかがマジであったそうです。
(ビューうんぬんというよりかは、自分が作ってないものを無断であっさり消せちゃう度胸が凄いと思いますが…)

できればビューの作成法は統一した方がいいですし、性質上、1ステっプでの表現力が高いSQLの方が
ビューを作るうえでは優位性があると思ってますが…。

さて、最近メールで「最近あまり更新されませんが、なんかありましたか?心配です」という
heart-warmingなメッセージから「将棋見に行ったりするのにかまけてブログ更新頻度落とすんじゃねぇよ!」
というどちらかというとhurtfulなメッセージまでいただきました。

いや、すみません。
ただ、純粋にネタが枯渇してきたというのが実情なのです。まだSAS歴4~5年程度なので底がそんなに深くないんです。
まあしばらく、色々試したり勉強したりしてネタのストックが溜まるまで、低頻度で気ままに更新させていただきます。(まあ、だいたい、データステップをネタにして、月30-40記事も更新してたっていうのが、ちょっと頭おかしいですよね)