If I have a dataset like this
| Metric | Prod | R_1 | R_2 | R_3 | R_4 |
| N | A | 1 | 2 | 4 | 5 |
| R | A | 2 | 33 | 4 | 5 |
| N | B | 21 | 3 | 3 | 3 |
| R | B | 1 | 2 | 3 | 4 |
I want to group by Metric and Prod.
Proc sql; create table want as select metric, prod, sum(r_1) as r_1, sum(r_2) as r_2, sum(r_3) as r_3, sum(r_4) as r_4 from have group by metric, prod; quit;
Here since it has only 4 variables to sum so I can write from R_1 to R_4. What if I had 100 variables to sum? What is the efficient way of doing this?
Thanks
Chandan Mishra
You can use a wildcard variable name in proc summary:
proc summary data=have sum;
by metric prod;
var r_:;
run;
If you absolutely want to do it in SQL, you can use a macro loop to generate the summations.
SAS/SQL doesn't support variable lists the way the data step and SAS procs do. One alternative is to do the SQL summations on a transposed version of your dataset.
The pure SQL way is to use dictionary.tables:
proc sql noprint; /* noprint because we do not want to see the SELECT INTO results as a table */
select catx(' ','sum(',name,') as', name) into :sums separated by ','
from dictionary columns
where libname='WORK'
and memname='HAVE'
and upcase(name) like 'R%'
;
create table want as select
metric,
prod,
&sums
from have
group by metric,prod
;
quit;
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and save with the early bird rate—just $795!
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.
Ready to level-up your skills? Choose your own adventure.