2016-07-20 11 views
-2

SAS質問をレコード生成したい:私は名前の列を有するテーブルがあります。以下に示すようにPrimary_coverage 4観測を有する、私は年間を通じてループマクロ、四半期、月及び列値

Primary_coverage 組み合わせる単一限界 無保険運転手 医療 人体への傷害

私は私のテーブル値を下図のように見える必要がありますように、動的に年、四半期、月、列値をループするマクロを作成するとします(2000Q1 2002Q4へ= 36ヶ月、12四半期、3年) 注:最も早い年は常に2000Q1から始まります

 
year quarter Primary_coverage months 
2000 1 combined single limit 36 
2000 2 combined single limit 33 
2000 3 combined single limit 30 
2000 4 combined single limit 27 
2001 1 combined single limit 24 
2001 2 combined single limit 21 
2001 3 combined single limit 18 
2001 4 combined single limit 15 
2002 1 combined single limit 12 
2002 2 combined single limit 9 
2002 3 combined single limit 6 
2002 4 combined single limit 3 
2000 1 uninsured motorist 36 
2000 2 uninsured motorist 33 
2000 3 uninsured motorist 30 
2000 4 uninsured motorist 27 
2001 1 uninsured motorist 24 
2001 2 uninsured motorist 21 
2001 3 uninsured motorist 18 
2001 4 uninsured motorist 15 
2002 1 uninsured motorist 12 
2002 2 uninsured motorist 9 
2002 3 uninsured motorist 6 
2002 4 uninsured motorist 3 
2000 1 Medical 36 
2000 2 Medical 33 
2000 3 Medical 30 
2000 4 Medical 27 
2001 1 Medical 24 
2001 2 Medical 21 
2001 3 Medical 18 
2001 4 Medical 15 
2002 1 Medical 12 
2002 2 Medical 9 
2002 3 Medical 6 
2002 4 Medical 3 
2000 1 Bodily Injury 36 
2000 2 Bodily Injury 33 
2000 3 Bodily Injury 30 
2000 4 Bodily Injury 27 
2001 1 Bodily Injury 24 
2001 2 Bodily Injury 21 
2001 3 Bodily Injury 18 
2001 4 Bodily Injury 15 
2002 1 Bodily Injury 12 
2002 2 Bodily Injury 9 
2002 3 Bodily Injury 6 
2002 4 Bodily Injury 3 

しかし、私は2003Q2私のテーブルで同じプログラムを実行すると、以下のようになります。(2000Q1 42 = 2003Q2ヶ月、14四半期、3年)を

 
year quarter Primary_coverage months 
2000 1 combined single limit 42 
2000 2 combined single limit 39 
2000 3 combined single limit 36 
2000 4 combined single limit 33 
2001 1 combined single limit 30 
2001 2 combined single limit 27 
2001 3 combined single limit 24 
2001 4 combined single limit 21 
2002 1 combined single limit 18 
2002 2 combined single limit 15 
2002 3 combined single limit 12 
2002 4 combined single limit 9 
2003 1 combined single limit 6 
2003 2 combined single limit 3 
2000 1 uninsured motorist 42 
2000 2 uninsured motorist 39 
2000 3 uninsured motorist 36 
2000 4 uninsured motorist 33 
2001 1 uninsured motorist 30 
2001 2 uninsured motorist 27 
2001 3 uninsured motorist 24 
2001 4 uninsured motorist 21 
2002 1 uninsured motorist 18 
2002 2 uninsured motorist 15 
2002 3 uninsured motorist 12 
2002 4 uninsured motorist 9 
2003 1 uninsured motorist 6 
2003 2 uninsured motorist 3 
2000 1 Medical 42 
2000 2 Medical 39 
2000 3 Medical 36 
2000 4 Medical 33 
2001 1 Medical 30 
2001 2 Medical 27 
2001 3 Medical 24 
2001 4 Medical 21 
2002 1 Medical 18 
2002 2 Medical 15 
2002 3 Medical 12 
2002 4 Medical 9 
2003 1 Medical 6 
2003 2 Medical 3 
2000 1 Bodily Injury 42 
2000 2 Bodily Injury 39 
2000 3 Bodily Injury 36 
2000 4 Bodily Injury 33 
2001 1 Bodily Injury 30 
2001 2 Bodily Injury 27 
2001 3 Bodily Injury 24 
2001 4 Bodily Injury 21 
2002 1 Bodily Injury 18 
2002 2 Bodily Injury 15 
2002 3 Bodily Injury 12 
2002 4 Bodily Injury 9 
2003 1 Bodily Injury 6 
2003 2 Bodily Injury 3 
+1

必要な最小限の情報しか表示されないように質問を編集することをお勧めします。そのテーブルには、あなたが求めているものとは関係のない情報がたくさんあるようです。そのために人々はそれを試して解読することはまずありません。最小、完全、および検証可能なサンプルの作成については、ここをクリックしてください。http://stackoverflow.com/help/mcve –

答えて

0

日付の組み合わせを使用しますこれを達成するための機能。 INTNXを使用して日付を増減し、YYYYQQをSAS日付に変換するにはinput()を使用します。

Doループは簡単です。

%let end_date = 2003Q2; 

data date_list; 
    format end_date date9. coverage $20.; 
    end_date=input("&end_date", yyq6.); 
    n_months=intck('month', '01Jan2000'd, end_date)+3; 



    do coverage='Primary', 'Secondary', 'Tertiary'; 
    date=end_date; 
     do months=n_months to 3 by -3; 
      year=year(date); 
      quarter=qtr(date); 
      date=intnx('month', date, -3, 'b'); 
      output; 
     end; 
    end; 
    Keep year quarter months coverage; 
run; 
関連する問題