Data Set
ID Date Variable
111 12/7/2021 A
111 12/7/2021 B
111 12/7/2021 C
222 12/6/2021 A
222 12/7/2021 A
Expected Result
ID Date Variable
111 12/7/2021 A, B, C
222 12/6/2021 A
222 12/7/2021 A
Typically two ways - one is a data step and combine as you go down the rows and output on the last group record. This utilizes RETAIN and BY group processing.
The second method is to transpose the data into a wide format using PROC TRANSPOSE and then use CATX() to combine the data.
Both are illustrated below.
*create sample data for demonstration;
data have;
infile cards dlm='09'x;
input OrgID Product $ States $;
cards;
1 football DC
1 football VA
1 football MD
2 football CA
3 football NV
3 football CA
;
run;
*Sort - required for both options;
proc sort data=have;
by orgID;
run;
**********************************************************************;
*Use RETAIN and BY group processing to combine the information;
**********************************************************************;
data want_option1;
set have;
by orgID;
length combined $100.;
retain combined;
if first.orgID then
combined=states;
else
combined=catx(', ', combined, states);
if last.orgID then
output;
run;
**********************************************************************;
*Transpose it to a wide format and then combine into a single field;
**********************************************************************;
proc transpose data=have out=wide prefix=state_;
by orgID;
var states;
run;
data want_option2;
set wide;
length combined $100.;
combined=catx(', ', of state_:);
run;
https://gist.github.com/statgeek/d583cfa992bf56da51d435165b07e96a
@annaleticia wrote:
Data Set
ID Date Variable
111 12/7/2021 A
111 12/7/2021 B
111 12/7/2021 C
222 12/6/2021 A
222 12/7/2021 A
Expected Result
ID Date Variable
111 12/7/2021 A, B, C
222 12/6/2021 A
222 12/7/2021 A
Typically two ways - one is a data step and combine as you go down the rows and output on the last group record. This utilizes RETAIN and BY group processing.
The second method is to transpose the data into a wide format using PROC TRANSPOSE and then use CATX() to combine the data.
Both are illustrated below.
*create sample data for demonstration;
data have;
infile cards dlm='09'x;
input OrgID Product $ States $;
cards;
1 football DC
1 football VA
1 football MD
2 football CA
3 football NV
3 football CA
;
run;
*Sort - required for both options;
proc sort data=have;
by orgID;
run;
**********************************************************************;
*Use RETAIN and BY group processing to combine the information;
**********************************************************************;
data want_option1;
set have;
by orgID;
length combined $100.;
retain combined;
if first.orgID then
combined=states;
else
combined=catx(', ', combined, states);
if last.orgID then
output;
run;
**********************************************************************;
*Transpose it to a wide format and then combine into a single field;
**********************************************************************;
proc transpose data=have out=wide prefix=state_;
by orgID;
var states;
run;
data want_option2;
set wide;
length combined $100.;
combined=catx(', ', of state_:);
run;
https://gist.github.com/statgeek/d583cfa992bf56da51d435165b07e96a
@annaleticia wrote:
Data Set
ID Date Variable
111 12/7/2021 A
111 12/7/2021 B
111 12/7/2021 C
222 12/6/2021 A
222 12/7/2021 A
Expected Result
ID Date Variable
111 12/7/2021 A, B, C
222 12/6/2021 A
222 12/7/2021 A
What do you expect to do with that data set that you can't do with the original?
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
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.