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

Hi All,

I have created a programe to create table for trimester. 

I m looking for ur help/suggestion if that can be bit sort/small and with less complex.

Code:


data test;
x="01jan2016"d;
if MONTH(INTNX("MONTH",x,-1))<=4 then do ;
DO I= MONTH(INTNX("MONTH",x,-1)) to 1 by -1;
do j= i to 1 by -1;
TIME=cats("T1_M",i,"_",Year(INTNX("MONTH",x,-1)));
YRMO=INPUT(PUT(INTNX("MONTH",x,-MONTH(INTNX("MONTH",x,-1))+j-1),YYMMN6.),6.);
output;
end;
end;
end;

if 4< MONTH(INTNX("MONTH",x,-1))<=8 then do ;
DO I= MONTH(INTNX("MONTH",x,-1)) to 1 by -1;

if i <=4 then do;
do j= i to 1 by -1;
TIME=cats("T1_M",i,"_",Year(INTNX("MONTH",x,-1)));
YRMO=INPUT(PUT(INTNX("MONTH",x,-MONTH(INTNX("MONTH",x,-1))+j-1),YYMMN6.),6.);
output;
end;
end;
else do;
do j= i to 5 by -1;
TIME=cats("T2_M",i-4,"_",Year(INTNX("MONTH",x,-1)));
YRMO=INPUT(PUT(INTNX("MONTH",x,-MONTH(INTNX("MONTH",x,-1))+j-1),YYMMN6.),6.);
output;
end;
end;
end;
end;
/****************/

if 8< MONTH(INTNX("MONTH",x,-1))<=12 then do ;
DO I= MONTH(INTNX("MONTH",x,-1)) to 1 by -1;

if i <=4 then do;
do j= i to 1 by -1;
TIME=cats("T1_M",i,"_",Year(INTNX("MONTH",x,-1)));
YRMO=INPUT(PUT(INTNX("MONTH",x,-MONTH(INTNX("MONTH",x,-1))+j-1),YYMMN6.),6.);
output;
end;
end;
else if 4< i <=8 then do;
do j= i to 5 by -1;
TIME=cats("T2_M",i-4,"_",Year(INTNX("MONTH",x,-1)));
YRMO=INPUT(PUT(INTNX("MONTH",x,-MONTH(INTNX("MONTH",x,-1))+j-1),YYMMN6.),6.);
output;
end;
end;
else if 8< i <=12 then do;
do j= i to 9 by -1;
TIME=cats("T3_M",i-8,"_",Year(INTNX("MONTH",x,-1)));
YRMO=INPUT(PUT(INTNX("MONTH",x,-MONTH(INTNX("MONTH",x,-1))+j-1),YYMMN6.),6.);
output;
end;
end;

end;
end;


run;

 

Thanks in advance

1 ACCEPTED SOLUTION

Accepted Solutions
Kurt_Bremser
Super User
data _null_;
date = date();
date = intnx('month',date,-1);
call symput('year',substr(put(year(date),z4.),3,2));
startmonth = int((month(date)-1)/4) * 4 +1;
call symput('startmonth',strip(put(startmonth,2.)));
call symput('endmonth',strip(put(month(date),2.)));
run;

data want1;
do month = &startmonth to &endmonth;
  month_print = put(mdy(month,1,&year),monyy5.);
  t = int((month-1)/4) + 1;
  if &startmonth = 1 and &endmonth = 12 /* whole year */
  then stopmonth = 4;
  else stopmonth = min(4,&endmonth-(t-1)*4);
  do m = mod(month-1,4)+1 to stopmonth;
    period = 'T'!!put(t,1.)!!'M'!!put(m,1.);
    output;
  end;
end;
run;

proc sort
  data=want1
  out=want(keep=month_print period)
;
by period month;
run;

To get the whole year, add

%let startmonth=1;

before the data want1 step

View solution in original post

10 REPLIES 10
Kurt_Bremser
Super User

Could you please state your logic in simnple language (ie date range of a to b is trimester 1, c to d is trimester 2, and so on)

 

Also use the code entry window (the "run SAS" symbol) to post SAS Code

 

And use proper formatting to make your code readable. As is, it is causing eyesores.

Aman4SAS
Obsidian | Level 7

LOGIC is

if i will run the programe IN JAN-2016 then i will get output as

MONTH       PERIOD

JAN15         T1M1
JAN15         T1M2
FEB15         T1M2
JAN15         T1M3
FEB15         T1M3
MAR15        T1M3
JAN15         T1M4
FEB15         T1M4
MAR15        T1M4
APR15         T1M4
MAY15       T2M1
MAY15      T2M2
JUN15      T2M2
MAY15    T2M3
JUN15    T2M3
JUL15    T2M3
MAY15    T2M4
JUN15    T2M4
JUL15    T2M4
AUG15    T2M4
SEP15    T3M1
SEP15    T3M2
OCT15    T3M2
SEP15    T3M3
OCT15    T3M3
NOV15    T3M3
SEP15    T3M4
OCT15    T3M4
NOV15    T3M4
DEC15    T3M4

I USED X AS TODAY() TO DO CROSS CHECK FOR EVERY MONTH'S OUTPUT
CODE:

 

 

DATA TEST;
X="01JAN2016"D;
/******FOR JAN TO APR MONTH******/
IF MONTH(INTNX("MONTH",X,-1))<=4 THEN
DO ;
               DO I= MONTH(INTNX("MONTH",X,-1)) TO 1 BY -1;
                         DO J= I TO 1 BY -1;
                                TIME=CATS("T1_M",I,"_",YEAR(INTNX("MONTH",X,-1)));
                                YRMO=INPUT(PUT(INTNX("MONTH",X,-MONTH(INTNX("MONTH",X,-1))+J-1),YYMMN6.),6.);
                                OUTPUT;
                        END;
              END;
END;

/********FOR MAY TO AUG MONTH********/
IF 4< MONTH(INTNX("MONTH",X,-1))<=8 THEN
DO ;
                    DO I= MONTH(INTNX("MONTH",X,-1)) TO 1 BY -1;
                               IF I <=4 THEN
                                        DO;
                                                DO J= I TO 1 BY -1;
                                                    TIME=CATS("T1_M",I,"_",YEAR(INTNX("MONTH",X,-1)));
                                                    YRMO=INPUT(PUT(INTNX("MONTH",X,-MONTH(INTNX("MONTH",X,-1))+J-1),YYMMN6.),6.);
                                                     OUTPUT;
                                                END;
                                       END;
                              ELSE DO;
                                             DO J= I TO 5 BY -1;
                                                  TIME=CATS("T2_M",I-4,"_",YEAR(INTNX("MONTH",X,-1)));
                                                  YRMO=INPUT(PUT(INTNX("MONTH",X,-MONTH(INTNX("MONTH",X,-1))+J-1),YYMMN6.),6.);
                                                  OUTPUT;
                                            END;
                                       END;
                     END;
END;
/*******FOR SEP TO DEC MONTH*********/

IF 8< MONTH(INTNX("MONTH",X,-1))<=12 THEN
                   DO ;
                          DO I= MONTH(INTNX("MONTH",X,-1)) TO 1 BY -1;
                               IF I <=4 THEN
                                       DO;
                                             DO J= I TO 1 BY -1;
                                                   TIME=CATS("T1_M",I,"_",YEAR(INTNX("MONTH",X,-1)));
                                                   YRMO=INPUT(PUT(INTNX("MONTH",X,-MONTH(INTNX("MONTH",X,-1))+J-1),YYMMN6.),6.);
                                                  OUTPUT;
                                            END;
                                      END;
                              ELSE IF 4< I <=8 THEN
                                       DO;
                                           DO J= I TO 5 BY -1;
                                              TIME=CATS("T2_M",I-4,"_",YEAR(INTNX("MONTH",X,-1)));
                                              YRMO=INPUT(PUT(INTNX("MONTH",X,-MONTH(INTNX("MONTH",X,-1))+J-1),YYMMN6.),6.);
                                              OUTPUT;
                                           END;
                                       END;
                           ELSE IF 8< I <=12 THEN
                                      DO;
                                          DO J= I TO 9 BY -1;
                                             TIME=CATS("T3_M",I-8,"_",YEAR(INTNX("MONTH",X,-1)));
                                            YRMO=INPUT(PUT(INTNX("MONTH",X,-MONTH(INTNX("MONTH",X,-1))+J-1),YYMMN6.),6.);
                                            OUTPUT;
                                         END;
                                      END;
              END;
END;


RUN;

 

andreas_lds
Jade | Level 19

Still hardly possible to understand why you are doing what you are doing.

Aman4SAS
Obsidian | Level 7

Hi, I using to generate few reports . my question is simple that can i get this output more simply methor/code?

Kurt_Bremser
Super User

So I guess you might want this:

%let year=15;

data want1;
do month = 1 to 12;
  month_print = put(mdy(month,1,&year),monyy5.);
  t = int((month-1)/4) + 1;
  do m = mod(month-1,4)+1 to 4;
    period = 'T'!!put(t,1.)!!'M'!!put(m,1.);
    output;
  end;
end;
run;

proc sort
  data=want1
  out=want(keep=month_print period)
;
by period month;
run;
Aman4SAS
Obsidian | Level 7

Hi, 

 

Thanks a lot for your valuable time and solution over my problem.

I need it dyanamic as i mention that when i will run it on December then it will give me output till november on same patter as ur code is providing output. i.e in Jan it will give complete last year output , in Feb it will give only Jan T1M1 and Mar it will give :

Jan T1M1

Jan T2m2

Feb T2M2

as so on.

 

Thanks

Kurt_Bremser
Super User

Within each month, you already have the code that gives the entries for that particular month, as you stated in your OP.

If you need the window to roll over years, you need an addtional outer loop over the years and within the years start and end with the correct required months.

If it is more complicated than that, you need to specify the wanted output for different time windows.

Aman4SAS
Obsidian | Level 7

As i have mentioned in my previous post:

i have only value is today();

in case if i will run the code in month of jan -16 then i will get out put :

JAN15 T1M1

JAN15 T1M2

FEB15 T1M2

JAN15 T1M3

FEB15 T1M3

MAR15 T1M3

JAN15 T1M4

FEB15 T1M4

MAR15 T1M4

APR15  T1M4

MAY15 T2M1

MAY15 T2M2

 

JUN15  T2M2

MAY15 T2M3

JUN15  T2M3

 

JUL15   T2M3

MAY15 T2M4

JUN15  T2M4 

JUL15   T2M4

 

AUG15  T2M4

SEP15 T3M1

SEP15  T3M2

OCT15 T3M2

SEP15  T3M3

OCT15 T3M3

 

NOV15 T3M3

SEP15  T3M4

OCT15 T3M4

NOV15 T3M4

DEC15 T3M4

 

WHEN I WILL RUN IN FEB16 THEN I WILL GET OUTPUT :

JAN16 T1M1

WHEN I WILL RUN IN MAR16 THEN I WILL GET OUTPUT :

JAN16 T1M1

JAN16 T1M2

FEB16 T1M2

WHEN I WILL RUN IN APR16 THEN I WILL GET OUTPUT :

JAN16 T1M1

JAN16 T1M2

FEB16 T1M2

 

JAN16 T1M3

FEB16 T1M3

MAR16 T1M3

WHEN I WILL RUN IN MAY16 THEN I WILL GET OUTPUT :

JAN16 T1M1

JAN16 T1M2

FEB16 T1M2

JAN16 T1M3

FEB16 T1M3

MAR16 T1M3

JAN16 T1M4

FEB16 T1M4

MAR16 T1M4

APR16 T1M4

WHEN I WILL RUN IN JUN16 THEN I WILL GET OUTPUT :

MAY16 T2M1

WHEN I WILL RUN IN JUL16 THEN I WILL GET OUTPUT :

MAY16 T2M1

MAY16 T2M2

JUN16 T2M2

WHEN I WILL RUN IN AUG16 THEN I WILL GET OUTPUT :

MAY16 T2M1

MAY16 T2M2

JUN16 T2M2

MAY16 T2M3

JUN16 T2M3

JUL16 T2M3

WHEN I WILL RUN IN SEP16 THEN I WILL GET OUTPUT :

MAY16 T2M1

MAY16 T2M2

JUN16 T2M2

MAY16 T2M3

JUN16 T2M3

JUL16 T2M3

MAY16 T2M4

JUN16 T2M4

JUL16 T2M4

AUG16 T2M4

WHEN I WILL RUN IN OCT16 THEN I WILL GET OUTPUT :

SEP16 T3M1

WHEN I WILL RUN IN NOV16 THEN I WILL GET OUTPUT :

SEP16 T3M1

SEP16 T3M2

OCT16 T3M2

WHEN I WILL RUN IN DEC16 THEN I WILL GET OUTPUT :

SEP16 T3M1

SEP16 T3M2

OCT16 T3M2

SEP16 T3M3

OCT16 T3M3

NOV16 T3M3

WHEN I WILL RUN IN JAN1716 THEN I WILL GET OUTPUT :

SEP16 T3M1

SEP16 T3M2

OCT16 T3M2

SEP16 T3M3

OCT16 T3M3

NOV16 T3M3

SEP16 T3M4

OCT16 T3M4

NOV16 T3M4

DEC16 T3M4

 

 

THIS IS A SAMPLE FOR MY DESIRE OUTPUT: HERE MMDDYYN10. COLUMN ALSO ADDED FOR RESPECTIVE FIRST DAY OF MONTH I.E FOR JAN15 - 01012015

 

I HOPE IT WILL HELP YOU TO UNDERSTAND MY REQUEST

 

 

 

 

Kurt_Bremser
Super User
data _null_;
date = date();
date = intnx('month',date,-1);
call symput('year',substr(put(year(date),z4.),3,2));
startmonth = int((month(date)-1)/4) * 4 +1;
call symput('startmonth',strip(put(startmonth,2.)));
call symput('endmonth',strip(put(month(date),2.)));
run;

data want1;
do month = &startmonth to &endmonth;
  month_print = put(mdy(month,1,&year),monyy5.);
  t = int((month-1)/4) + 1;
  if &startmonth = 1 and &endmonth = 12 /* whole year */
  then stopmonth = 4;
  else stopmonth = min(4,&endmonth-(t-1)*4);
  do m = mod(month-1,4)+1 to stopmonth;
    period = 'T'!!put(t,1.)!!'M'!!put(m,1.);
    output;
  end;
end;
run;

proc sort
  data=want1
  out=want(keep=month_print period)
;
by period month;
run;

To get the whole year, add

%let startmonth=1;

before the data want1 step

Aman4SAS
Obsidian | Level 7

Thanks, in my code x is a trigger as date() or today(). 

we can replace x by date() or today(). i  use check the data/movement for whole year.

in ur code its breaking for 4-4 month, its my mistake i have provided you output like that. 

 

Thanks a lot.

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 10 replies
  • 2134 views
  • 0 likes
  • 3 in conversation