Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calculate Columns Cumulative Sum and Percentage in SAS

Tags:

sql

sas

I need some help with creating a query as SAS proc SQL.

Consider the following dataset which has sales from different regions already bucketed by 3 hour chunks (its only a subset, actual data covers 24 hours):

 Date        ObsAtHour Region   Sales
 1/1/2018    2         Asia     76 
 1/1/2018    2         Africa   5 
 1/1/2018    5         Asia     14
 1/1/2018    5         Africa   10
 2/1/2018    2         Asia     40
 2/1/2018    2         Africa   1 
 2/1/2018    5         Asia     15
 2/1/2018    5         Africa   20

I get data covering last 45 days..

I am trying to do two things

1) Group by date, ObsAtHour and Region and get cumulative sum of Sales such that I get something like

 Date        ObsAtHour Region   Sales CumSales
 1/1/2018    2         Asia     76    76
 1/1/2018    2         Africa   5     5
 1/1/2018    5         Asia     14    90
 1/1/2018    5         Africa   10    15
 2/1/2018    2         Asia     40    40
 2/1/2018    2         Africa   1     1
 2/1/2018    5         Asia     15    55
 2/1/2018    5         Africa   20    21

2) Get Percentage for sales that indicate what percentage of daily sales per Region has been achieved at any obsAtHour. It would look like:

 Date        ObsAtHour Region   Sales CumSales  Pct
 1/1/2018    2         Asia     76    76        84%
 1/1/2018    2         Africa   5     5         33%
 1/1/2018    5         Asia     14    90        100%
 1/1/2018    5         Africa   10    15        100%
 2/1/2018    2         Asia     40    40        72% 
 2/1/2018    2         Africa   1     1         4.76%
 2/1/2018    5         Asia     15    55        100%
 2/1/2018    5         Africa   20    21        100% 

Your help will be very appreciated.

like image 371
Khurram Majeed Avatar asked Dec 13 '25 17:12

Khurram Majeed


1 Answers

something like below

data have;
input Date:mmddyy10.        ObsAtHour Region $  Sales;
format date mmddyy10;
datalines;
1/1/2018    2         Asia     76 
1/1/2018    2         Africa   5 
1/1/2018    5         Asia     14
1/1/2018    5         Africa   10
2/1/2018    2         Asia     40
2/1/2018    2         Africa   1 
2/1/2018    5         Asia     15
2/1/2018    5         Africa   20
 ;
 proc sort data=have;
 by date region;
 run;

/* this gives moving sum*/
 data have1;
format date mmddyy10.;
set have;
by   date region;
 if first.region then sumsales = sales;
  else sumsales+sales;
  run;

/* get the total sales from your intial table by group and join it back 
and calculate the percent*/
proc sql;
select a.*, sumsales/tot_sales  as per format =percent10.2 from 
(select * from have1)a
inner join
(select region , date, sum(sales) as tot_sales
from have
group by 1, 2)b
on a.region =b.region
 and a.date =b.date;
like image 50
Kiran Avatar answered Dec 15 '25 09:12

Kiran



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!