Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sas conditional sum into new field

I'm new to SAS and have a simple dataset called ORIG_DATA from which I need to create a new dataset SUMMARY which shows the total by Salesman_ID by Day_ID

In essence the SUMMARY output should look like this where the numbers are the sum of totals.

Salesman_ID|Day_1|Day_2
A          |30   |40
B          |60   |0
C          |20   |70

In SQL, I do

Select salesman_id, 
sum(case when day_id=1 then total else 0 end) as day_1,
sum(case when day_id=2 then total else 0 end) as day_2
from ORIG_DATA group by salesman_id

but for this problem I'm not allowed to use proc sql. How else can I do this in SAS? Haven't the foggiest at the moment. apologies for nontable format

ORIG_DATA as below

Day_ID|Salesman_ID|Other_field|total
1     |A          |R000       |10
1     |A          |R002       |20
2     |A          |R000       |10
2     |A          |R004       |30
1     |B          |R002       |20
1     |B          |R000       |40
1     |B          |R004       |0
2     |C          |R003       |40
2     |C          |R004       |10
1     |C          |R002       |20
2     |C          |R002       |20
like image 275
wanderingmanifold Avatar asked Nov 19 '25 13:11

wanderingmanifold


1 Answers

You can solve the problem with a simple data step, see the code below. You need to sort the data first, and then instruct the data to work with groups where you reset the day_1 and day_2 to zero at the start of a new group and you output to the data set at the last observation.

Let me know if you have any questions.

data ORIG_DATA  ;
input Day_ID Salesman_ID $ Other_field $ total ;
cards ;
1  A  R000  10
1  A  R002  20
2  A  R000  10
2  A  R004  30
1  B  R002  20
1  B  R000  40
1  B  R004  0
2  C  R003  40
2  C  R004  10
1  C  R002  20
2  C  R002  20
;run;

proc sort;
   by salesman_id; 
RUN; 

data salesman_id (drop=Day_ID Other_field total); 
  set orig_data; 
  by salesman_id; 
   if first.salesman_id then do; 
     day_1 = 0; 
     day_2 = 0;
   end; 
  if day_id=1 then day_1 + total; 
  if day_id=2 then day_2 + total;
  if last.salesman_id then output; 
RUN; 
like image 52
Vasilij Nevlev Avatar answered Nov 21 '25 04:11

Vasilij Nevlev



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!