1
votes

I have data that looks like this in SAS;

Date    Type_1  Type_2
4/8/2015 21654.72   .
4/9/2015 34490.13   .
4/9/2015 32429      .
4/9/2015    .      24438.76
4/9/2015    .      54043.18
4/9/2015    .      58969.06
4/9/2015    .      57721.01
4/9/2015    .      46313.08
4/10/2015   .      49974.06
4/10/2015   .      52403.41
4/10/2015 25260.07  .
4/10/2015 27891.98  .
4/11/2015   .      28130.06
4/11/2015 24886.15  .
4/11/2015 10407.6   .
4/11/2015 49422.71  .
4/11/2015 15242.28  .
4/11/2015   .      25295.52
4/11/2015   .      17522.67
4/13/2015 29798.99  .
4/13/2015 10445.17  .
4/13/2015 23678.87  .
4/13/2015   .      35470.87
4/13/2015   .      33941.01
4/13/2015   .      30206.06
4/13/2015   .      26591.98

I'm trying to use a SAS data step sum up type_1 and type_2 and consolidate both columns by date.

I've tried code like this:

data work.data;
    set data_consolidated;
    by date;

    if first.date then total_type_1=0 and total_type_2=0;
    total_type_1 + type_1;
    total_type_2 + type_2;
    if last.date then output;
    drop type_1;
    drop_type_2;
run;

This code consilidates the date, but instead of summing all values that are in the columns for the date, it is adding the current value to all previous values in a cumulative fashion.

Just to be clear, below is an example of what I'm trying to get the data to look like:

date     type_1        type_2
4/8/2015    21654.72    .
4/9/2015    66919.13    128472.85
4/10/2015   53152.05    102377.47
4/11/2015   99958.74    70948.25

Any advice or help is greatly appreciated.

2

2 Answers

2
votes

Try this:

proc sql;
   select distinct date, sum(type_1) as type_1, sum(type_2) as type_2 from data_consolidated group by date;
quit;
1
votes

I think your problem is this line.

if first.date then total_type_1=0 and total_type_2=0;

This will result in setting total_type_1 to either a 1 (true) or 0 (false) based on the evaluation of the boolean expression on the right side of the assignment statement. The value of total_type_2 is not changed.

Perhaps you meant to do:

if first.date then total_type_1=0;
if first.date then total_type_2=0;

or

if first.date then do;
  total_type_1=0;
  total_type_2=0;
end; 

Using a DOW loop is a good way to do this type of thing in a data step.

data want;
  do until(last.date);
    set data_consolidated;
    by date;
    total_type_1 = sum(total_type_1,type_1,0);
    total_type_2 = sum(total_type_2,type_2,0);
  end;
  drop type_1 type_2 ;
run;