Расчет пропорций и накопленных данных в SAS - PullRequest
0 голосов
/ 22 мая 2018

У меня есть набор данных под названием магазины . Я хочу извлечь total_sales (retail_price), доля продаж и совокупная доля продаж по каждому магазину в SAS.

Пример набора данных: - Магазины

Date       Store_Postcode   Retail_Price    month   Distance
08/31/2013  CR7 8LE              470           8    7057.8
10/26/2013  CR7 8LE              640           10   7057.8
08/19/2013  CR7 8LE              500           8    7057.8
08/17/2013  E2 0RY               365           8    1702.2
09/22/2013  W4 3PH               395.5         12   2522
06/19/2013  W4 3PH               360.5         6    1280.9
11/15/2013  W10 6HQ              475           12   3213.5
06/20/2013  W10 6HQ              500           1    3213.5
09/18/2013  E7 8NW               315           9    2154.8
10/23/2013  E7 8NW               570           10   5777.9
11/18/2013  W10 6HQ              455           11   3213.5
08/21/2013  W10 6HQ              530           8    3213.5

Код, который я пробовал: -

Proc sql;                                                                                                                               

Create table work.Top_sellers as                                                                                                         

Select Store_postcode as Stores,SUM(Retail_price) as Total_Sales,Round((Retail_price/Sum(Retail_price)),0.01) as               
Proportion_of_sales                                                                                                                     

From work.stores                                                                                                           

Group by Store_postcode                                                                                                                 
Order by total_sales;                                                                                                                   

Quit;  

Я не знаю, как рассчитать накопительную переменную в proc sql ... Пожалуйста, помогите мне улучшить мой код !!

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Я передумал, CDF - это другой расчет.Вот как это сделать с помощью шага данных.Сначала вычислите кумулятивные итоги (я использовал шаг данных здесь, но я мог бы использовать PROC EXPAND, если у вас был SAS / ETS).

*sort demo data;
proc sort data=sashelp.shoes out=shoes;
by region sales;
run;

data cTotal last (keep = region cTotal);
set shoes;
by region;

*calculate running total;
if first.region then cTotal=0;
cTotal = cTotal + sales;

*output records, everything to cTotal but only the last record which is total to Last dataset;
if last.region then output last;
output cTotal;

retain cTotal;
run;

*merge in results and calculate percentages;
data calcs;
merge cTotal Last (rename=cTotal=Total);
by region;

percent = cTotal/Total;
run;

Если вам нужно более эффективное решение, я бы попробовал решение DoW.

0 голосов
/ 22 мая 2018

Для вычисления кумулятивного результата в SQL требуется, чтобы данные имели явный уникальный упорядоченный ключ, а в запросе используется рефлексивное соединение с «треугольными» критериями для кумулятивного аспекта.

data have;
  do id = 100 to 120;
    sales = ceil (10 + 25 * ranuni(123));
    output;
  end;
run;

proc sql;
  create table want as
  select 
    have1.id
  , have1.sales
  , sum(have2.sales) as sales_cusum
  from
    have as have1
  join
    have as have2
  on 
    have1.id >= have2.id  /* 'triangle' criteria */
  group by
    have1.id, have1.sales
  order by
    have1.id
  ;
quit;

Второй способ заключается в повторном-считать кусум построчно

proc sql;
  create table want as
  select have.id, have.sales, 
   ( select sum(inner.sales) 
     from (select * from have) as inner
     where inner.id <= have.id
   )
   as cusum
  from
   have;
...