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

 Hi All,

 

I have the dataset below which gives me details of account conversions at a sub account level.

 

data have;
	input account_id $ Sub_no $ reporting_date conversion_date;
	informat reporting_date conversion_date date9.;
	format reporting_date conversion_date date9.;
	
	cards;
	12345 1 31JAN2018 .
	12345 2 31JAN2018 .
	12345 3 31JAN2018 .
	67891 1 31JAN2018 .
	67891 2 31JAN2018 .
	12345 1 28FEB2018 28FEB2018
	12345 2 28FEB2018.
	12345 3 28FEB2018 .
	67891 1 28FEB2018 .
	67891 2 28FEB2018 28FEB2018
	;
run;


 

What I need is to aggregate this data to show the below

 

Account_IDReporting DateConversion_Date
1234531-Jan-18.
6789131-Jan-18.
1234528-Feb-1828-Feb-18
6789128-Feb-1828-Feb-18

 

I need to view 1 record per account number and reporting date irrespective of number of sub accounts the data has been aggregated from.

 

 

Many Thanks

 

Adnan

1 ACCEPTED SOLUTION

Accepted Solutions
Kurt_Bremser
Super User

Two approaches, SQL and data step, that produce the same result:

data have;
input account_id $ Sub_no $ reporting_date conversion_date;
informat reporting_date conversion_date date9.;
format reporting_date conversion_date date9.;
cards;
12345 1 31JAN2018 .
12345 2 31JAN2018 .
12345 3 31JAN2018 .
67891 1 31JAN2018 .
67891 2 31JAN2018 .
12345 1 28FEB2018 28FEB2018
12345 2 28FEB2018.
12345 3 28FEB2018 .
67891 1 28FEB2018 .
67891 2 28FEB2018 28FEB2018
;
run;

proc sql;
create table want1 as
select account_id, reporting_date, max(conversion_date) as conversion_date format=date9.
from have
group by reporting_date, account_id;
quit;

data want2;
set have (rename=(conversion_date=_cvdate));
by reporting_date account_id;
retain conversion_date;
format conversion_date date9.;
if _cvdate ne . then conversion_date = _cvdate;
if last.account_id then output;
drop _cvdate sub_no;
run;

View solution in original post

2 REPLIES 2
PaigeMiller
Diamond | Level 26

PROC SUMMARY will do this

 

UNTESTED CODE

proc summary data=have;
    class account_id;
    var reporting_date conversion_date;
    output out=want min=;
run;
--
Paige Miller
Kurt_Bremser
Super User

Two approaches, SQL and data step, that produce the same result:

data have;
input account_id $ Sub_no $ reporting_date conversion_date;
informat reporting_date conversion_date date9.;
format reporting_date conversion_date date9.;
cards;
12345 1 31JAN2018 .
12345 2 31JAN2018 .
12345 3 31JAN2018 .
67891 1 31JAN2018 .
67891 2 31JAN2018 .
12345 1 28FEB2018 28FEB2018
12345 2 28FEB2018.
12345 3 28FEB2018 .
67891 1 28FEB2018 .
67891 2 28FEB2018 28FEB2018
;
run;

proc sql;
create table want1 as
select account_id, reporting_date, max(conversion_date) as conversion_date format=date9.
from have
group by reporting_date, account_id;
quit;

data want2;
set have (rename=(conversion_date=_cvdate));
by reporting_date account_id;
retain conversion_date;
format conversion_date date9.;
if _cvdate ne . then conversion_date = _cvdate;
if last.account_id then output;
drop _cvdate sub_no;
run;

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 2 replies
  • 2575 views
  • 0 likes
  • 3 in conversation