从BY GROUP的.LAST值推断运行总计

时间:2014-02-03 04:52:55

标签: sql sas running-total s datastep

我试图找出如何创建一个运行总计,如果我们只有.LAST变量中的总和。我创建了一个样本数据集,它可以让我更清楚我所追求的内容:

DATA SALES_DATA; 
    INPUT REGION_ID STORE_ID YEAR SALES; 
    DATALINES; 
        1   1   2000    .
        1   1   2001    .
        1   1   2002    .
        1   1   2003    40
        1   2   1977    .
        1   2   1978    .
        1   2   1979    .
        1   2   1980    .
        1   2   1981    12
        2   3   1999    .
        2   3   2000    .
        2   3   2001    .
        2   4   2002    17
        3   4   1956    .
        3   4   1957    22

所以,正如您所看到的,我们只有商店上次营业时的数据,其中包括前几年的所有销售额。假设销售额是完全线性的并且逐年增加,那么我如何告诉SAS获取STORE_ID.LAST值然后将它除以我们有数据的年数将它放入STORE_ID.FIRST的SALES字段?一旦我弄清楚如何将最后一个字段的值输入到第一个字段中,我计划只运行通常的运行总计(在除以计数之后,可以通过以下方式创建:

DATA SALES; 
    SET SALES; 
    BY REGION_ID STORE_ID; 
    IF FIRST.STORE = 1 THEN 
        COUNT =0;
        COUNT+1; 
run;

所以,理想情况下,决赛桌的开头是:

DATA SALES_DATA; 
INPUT REGION_ID STORE_ID YEAR SALES; 
DATALINES; 
    1   1   2000    10
    1   1   2001    20
    1   1   2002    30
    1   1   2003    40

...

我查看了PROC EXPAND,但我无法让它适合我的情况。任何建议都非常欢迎!

2 个答案:

答案 0 :(得分:3)

/* First calculate the sales per year */
proc sql ;
  create table meansales as
  select region_id, store_id, sum(sales) / count(year) as YEARLY_SALES
  from sales_data
  group by region_id, store_id 
  order by region_id, store_id ;
quit ;

/* Merge back into original data */
data yearcalc ;
  merge sales_data
        meansales ;
  by region_id store_id ;
  if first.store_id then n = 0 ;
  n + 1 ;
  NEW_SALES = n * YEARLY_SALES ;

  drop n ;
run ;

答案 1 :(得分:2)

对Chris J的代码稍作改进,只需在proc sql中进行外推即可。别忘了给他充分的信任:)

proc sql;
    create table filled(rename=(sales_filled=sales)) as
    select REGION_ID, STORE_ID, YEAR, max(SALES)/(max(YEAR)-min(YEAR)+1)*(YEAR-min(YEAR)+1) as sales_filled
    from sales_data
    group by REGION_ID, STORE_ID
    order by REGION_ID, STORE_ID, Year;
quit;

注意:即使年份不连续(例如2001年某种程度上缺失),这种情况仍然有效,因为销售价值是根据“时间跨度”而不是“计数”来填补的。