2016-07-20 11 views
-2

SAS Frage: Ich habe eine Tabelle mit dem Namen einer Spalte mit: Primary_coverage 4 Beobachtung, wie unten gezeigt,Ich möchte ein Makro zu Schleife durch Jahr creat, Quartal, Monat und Spaltenwert

Primary_coverage Einzelgrenzt kombiniert nicht versicherte Autofahrer Medical Körperverletzung

ich mag dynamisch einen Makro zu Schleife durch Jahr, Quartal, Monat und Spaltenwert zu schaffen, so dass mein Tabellenwert, wie unten dargestellt aussehen: (2000Q1 bis 2002Q4 = 36 Monate, 12 Viertel, 3 Jahre) HINWEIS: Frühestes Jahr beginnt immer bei 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 

aber wenn ich das gleiche Programm auf 2003Q2 Mein Tisch laufen, wie unten gezeigt aussehen: (2000Q1 bis 2003Q2 = 42 Monate, 14 Quarters, 3 Jahre)

 
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

Ich empfehle Ihnen, die Frage so zu bearbeiten, dass nur die Mindestinformationen angezeigt werden. Es scheint eine Menge Informationen in dieser Tabelle zu geben, die für das, was du fragst, nicht relevant sind, und die Leute werden es deshalb wahrscheinlich nicht versuchen und entziffern. Sehen Sie hier, wie Sie ein minimales, vollständiges und überprüfbares Beispiel erstellen: http://stackoverflow.com/help/mcve –

Antwort

0

Verwenden Sie eine Kombination aus Datum Funktionen, um dies zu erreichen. Verwenden Sie INTNX zum Erhöhen/Dekrementieren des Datums und Eingabe() zum Konvertieren des YYYYQQ in ein SAS-Datum.

Do Loops sind einfach.

%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;