计算一年内金额

Count amount within an year

我有一个看起来像

的数据集
ID  STATUS  YEAR   AMOUNT  DT_1
.    OPEN   2010   12      12
.    OPEN   2009   24      10
.    OPEN   2008   32      1
AA   CLOSE  2015   150     12
AA   CLOSE  2014   200     10
AA   CLOSE  2010   10      8
AA   CLOSE  2009   20      7
AA   CLOSE  2008   18      5
AA   OPEN  2012   21      8
AA   OPEN  2001   20      7
AA   OPEN  2000   18      5

第 DT_1 列可能需要最多 12 个,最少 1 个。 我想计算每次在这个范围内有多少。这意味着我应该将上一年的金额分配给当年。 我想期待这样的事情

   ID  STATUS  YEAR   AMOUNT  DT_1
    .    OPEN   2010   12      24
    .    OPEN   2009   24      32
    .    OPEN   2008   32      .
    AA   CLOSE  2015   150     200
    AA   CLOSE  2014   200     10
    AA   CLOSE  2010   10      20
    AA   CLOSE  2009   20      18
    AA   CLOSE  2008   18      .
    AA   OPEN  2012   21      20
    AA   OPEN  2001   20      18
    AA   OPEN  2000   18      .

我试过如下

proc sql;
create table tab1 as
select ID, status, year, sum(amount) as tot_amount, dt_1 
from tab
group by 1,2,3;
quit;

但它没有给我预期的输出。

编辑:由于预期输出不同,我不得不编辑问题。

看看这是不是你想要的

data have;
input ID $ STATUS $ YEAR AMOUNT;
datalines;
.  OPEN  2010 12 
.  OPEN  2009 24 
.  OPEN  2008 32 
AA CLOSE 2015 150
AA CLOSE 2014 200
AA CLOSE 2010 10 
AA CLOSE 2009 20 
AA CLOSE 2008 18 
AA OPEN  2012 21 
AA OPEN  2001 20 
AA OPEN  2000 18 
;

data want(drop = s);
   merge have
         have(firstobs = 2 keep = amount STATUS 
              rename = (amount = DT_1 STATUS = s));
   if STATUS ne s then DT_1 = .;
run;

那么DT_1是上一年的金额吗?如果是这样的话,如果数据按 YEAR 的增加值排序,而不是像问题中显示的那样减少,那么会容易得多。然后你可以只使用LAG()函数。

proc sort data=HAVE out=WANT ;
  by id status year ;
run;
data WANT;
  set want ;
  by id status year;
  dt_1 = lag(amount);
  if first.status then dt_1=.;
run;