2017-02-23 34 views
0

SASには比較的新しいですが、私は珍しい問題を発見しました。私はいくつかのproc SQL文を使って、最新の月に基づいて変数を動的に作成します。私が検索したいテーブルは、その中に月の名前があり、ループしたい。 など。 LIBRARY.TABLE_JAN17_ALL LIBRARY.TABLE_DEC16_ALL等SAS - テーブル名に変数を使用

例コード: - > LIBRARY.TABLEACC_ & vMonth

DATA qtrMonth; 
INPUT vDay vMonth vMonthName $; 
DATALINES; 
31 01 JAN 
28 02 FEB 
31 03 MAR 
30 04 APR 
31 05 MAY 
30 06 JUN 
31 07 JUL 
31 08 AUG 
30 09 SEP 
31 10 OCT 
30 11 NOV 
31 12 DEC 
; 

DATA year; 
INPUT vYear ; 
DATALINES; 
14 
15 
16 
17 
; 
run; 

/* Next step is to do a cartesian join to populate 
    all possible Month & Year combos in the dataset */ 
PROC SQL; 
    create table popCalendar as 
    SELECT 
    mdy(a.vMonth,a.vDay, b.vYear) as MyDate format DATE9. 
    ,CAT(TRIM(a.vMonthName), b.vYear) as MonthName 
    FROM qtrMonth a 
    CROSS JOIN year b 
    ; 
quit; 

PROC SQL; 
create table tmpMax as 
Select Max(MyDate) as MaxDate 
FROM popCalendar 
WHERE MyDate < today(); 

/*select max monthName into vMonth variable */ 
SELECT trim(MonthName) into :vMonth 
FROM popCalendar a 
inner join tmpMAX b on a.MyDate = b.MaxDate; 
quit; 

/*Select from table using variable*/ 
proc sql; 
create table abc as 
select * from LIBRARY.TABLE_&vMonth._ALL; 

は以前、私は結末がMONTHNAME即ちLIBRARY_TABLEACC_JAN17たテーブル名は、このロジックを使用します。 私はこれに問題はありませんでしたが、変数がテーブル名の真ん中にあるのでエラーが出ます。 エラー:ファイルLIBRARY.TABLE_JAN17.DATAが存在しません。

私は次のコードを使用するとうまくいきますが、120ヶ月のデータをループしたいので、毎月個別に名前を付けたいとは思わない&年です。

%Let vMonth2 = JAN17; 

proc sql; 
create table abc as 
select * from LIBRARY.TABLE_&vMonth2._ALL ; 

問題は何ですか?

ありがとうございました。

答えて

0

2つの問題が考えられます。最も簡単なのは、マクロ変数に空白を挿入したことです。その理論をテストするには、値を周囲に何かを表示するだけです。

%put |&vmonth|; 

あなたのSQLコードは、マクロ変数を作るときの空白を削除するためにSASを強制的に(あなたがSASの古いバージョンを実行している場合の代わりにキーワードで区切って使用します)TRIMMEDキーワードを使用する必要があります。

SELECT MonthName into :vMonth trimmed 

他の可能性は、SASコンパイラは、オブジェクト名の中央にマクロ参照を見て混乱していると誤って実際の埋め込まれたブランク値に存在しない場合でも、二つ以上のトークンとして処理されることです。しかし、これは通常、マクロ変数値がマクロ引用符で囲まれている場合にのみ発生します。値に実際の空白が含まれていない場合は、%unquote()マクロ機能を使用してみてください。

select * from LIBRARY.%unquote(TABLE_&vMonth._ALL); 
+0

ありがとうございました。私はtrim(monthName)を使用していましたが、後で空白があることを認識していませんでした。 – mugenheimer

関連する問題