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 lock in 2025 pricing—just $495!
Still thinking about your presentation idea? The submission deadline has been extended to Friday, Nov. 14, at 11:59 p.m. ET.
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.