Sum 在两列之间拆分的行上求和

Sum 在两列之间拆分的行上求和,sum,sas,datastep,Sum,Sas,Datastep,我的数据是这样的,我不知道如何获得“想要”列。我尝试过保留、滞后和求和函数的各种组合,但不幸没有成功 month quantity1 quantity2 want 1 a x x+sum(b to l) 2 b y sum(x to y)+sum(c to l) 3 c z sum(x to z)+sum(d to l) 4

我的数据是这样的,我不知道如何获得“想要”列。我尝试过保留、滞后和求和函数的各种组合,但不幸没有成功

month   quantity1   quantity2   want
1       a           x           x+sum(b to l)
2       b           y           sum(x to y)+sum(c to l)
3       c           z           sum(x to z)+sum(d to l)
4       d       
5       e       
6       f       
7       g       
8       h       
9       i       
10      j       
11      k       
12      l       

感谢您在这件事上提供的任何帮助

您可以通过一个步骤完成这项工作,但以下两个步骤将产生所需的结果。第一步是计算相关
quantity1
值之和,第二步是将它们添加到相关
quantity2
值之和:

 data temp;
    input month qty1 qty2;
    datalines;
        1 1 100
        2 1 100
        3 1 100
        4 1 .
        5 1 .
        6 1 .
        7 1 .
        8 1 .
        9 1 .
        10 1 .
        11 1 .
        12 1 .
    ;
run;

proc sql;
    create table qty1_sums as select distinct
        a.*, sum(b.qty1) as qty1_sums
        from temp as a
        left join temp as b
        on a.month < b.month
        group by a.month;

    create table want as select distinct
        a.*,
        case when not missing(a.qty2) then sum(a.qty1_sums, sum(b.qty2)) end as want
        from qty1_sums as a
        left join temp as b
        on a.month >= b.month
        group by a.month;
quit;
数据温度;
输入月份qty1 qty2;
数据线;
1 1 100
2 1 100
3 1 100
4 1 .
5 1 .
6 1 .
7 1 .
8 1 .
9 1 .
10 1 .
11 1 .
12 1 .
;
跑
proc-sql;
创建表qty1_SUMMES作为select distinct
a、 *,和(b.qty1)作为qty1\u和
从临时工
左连接临时组件b
月日<月日
按a.月分组;
创建所需的表作为“选择不同”
a、 *,
如果未丢失(a.qty2),则sum(a.qty1_sums,sum(b.qty2))根据需要结束
从qty1_和作为
左连接临时组件b
a月>=b月
按a.月分组;
退出

您可以在一个步骤中完成此操作,但以下步骤将在两个步骤中产生所需的结果。第一步是计算相关
quantity1
值之和,第二步是将它们添加到相关
quantity2
值之和:

 data temp;
    input month qty1 qty2;
    datalines;
        1 1 100
        2 1 100
        3 1 100
        4 1 .
        5 1 .
        6 1 .
        7 1 .
        8 1 .
        9 1 .
        10 1 .
        11 1 .
        12 1 .
    ;
run;

proc sql;
    create table qty1_sums as select distinct
        a.*, sum(b.qty1) as qty1_sums
        from temp as a
        left join temp as b
        on a.month < b.month
        group by a.month;

    create table want as select distinct
        a.*,
        case when not missing(a.qty2) then sum(a.qty1_sums, sum(b.qty2)) end as want
        from qty1_sums as a
        left join temp as b
        on a.month >= b.month
        group by a.month;
quit;
数据温度;
输入月份qty1 qty2;
数据线;
1 1 100
2 1 100
3 1 100
4 1 .
5 1 .
6 1 .
7 1 .
8 1 .
9 1 .
10 1 .
11 1 .
12 1 .
;
跑
proc-sql;
创建表qty1_SUMMES作为select distinct
a、 *,和(b.qty1)作为qty1\u和
从临时工
左连接临时组件b
月日<月日
按a.月分组;
创建所需的表作为“选择不同”
a、 *,
如果未丢失(a.qty2),则sum(a.qty1_sums,sum(b.qty2))根据需要结束
从qty1_和作为
左连接临时组件b
a月>=b月
按a.月分组;
退出

听起来像是“滚动12个月的总和”。如果是这样,使用不同的数据结构(不是2个变量,而是24行1个变量)就容易多了;然后您就有了所有的ETS工具,或者SQL或SAS数据步骤中的一个简单过程

如果您不能/不会重新构造数据,那么您可以通过将数据加载到临时数组(或哈希表,但对于新手来说数组更简单)中来实现。这样你就可以提前了解整件事。例如:

data have;
  do month = 1 to 12;
    q_2014 = rand('Uniform')*10+500+month*5;
    q_2015 = rand('Uniform')*10+550+month*5;
    output;
  end;
run;

data want;
  array q2014[12] _temporary_;       *temporary array to hold data;
  array q2015[12] _temporary_;
  if _n_=1 then do;                  *load data into temporary arrays;
    do _n = 1 to n_data;
      set have point=_n nobs=n_data;
      q2014[_n] = q_2014;
      q2015[_n] = q_2015;
    end;
  end;
  set have;
  do _i = 1 to _n_;                          *grab the this_year data;
    q_rolling12 = sum(q_rolling12,q2015[_i]);
  end;
  do _j = _n_+1 to n_data;
    q_rolling12 = sum(q_rolling12,q2014[_j]);*grab the last_year data;
  end;
run;

听起来像是“滚动12个月的总和”。如果是这样,使用不同的数据结构(不是2个变量,而是24行1个变量)就容易多了;然后您就有了所有的ETS工具,或者SQL或SAS数据步骤中的一个简单过程

如果您不能/不会重新构造数据,那么您可以通过将数据加载到临时数组(或哈希表,但对于新手来说数组更简单)中来实现。这样你就可以提前了解整件事。例如:

data have;
  do month = 1 to 12;
    q_2014 = rand('Uniform')*10+500+month*5;
    q_2015 = rand('Uniform')*10+550+month*5;
    output;
  end;
run;

data want;
  array q2014[12] _temporary_;       *temporary array to hold data;
  array q2015[12] _temporary_;
  if _n_=1 then do;                  *load data into temporary arrays;
    do _n = 1 to n_data;
      set have point=_n nobs=n_data;
      q2014[_n] = q_2014;
      q2015[_n] = q_2015;
    end;
  end;
  set have;
  do _i = 1 to _n_;                          *grab the this_year data;
    q_rolling12 = sum(q_rolling12,q2015[_i]);
  end;
  do _j = _n_+1 to n_data;
    q_rolling12 = sum(q_rolling12,q2014[_j]);*grab the last_year data;
  end;
run;

对quantity1求和,然后将值存储到宏变量中是很方便的。使用“多余”数据示例:

proc sql;
   select sum(qty1) into:sum_qty1 from temp;
quit;

data want;
   set temp;
   value1+qty1;
   value2+qty2;
   want=value2+&sum_qty1-value1;
   if missing(qty2) then want=.;
   drop value:;
run; 

对quantity1求和,然后将值存储到宏变量中是很方便的。使用“多余”数据示例:

proc sql;
   select sum(qty1) into:sum_qty1 from temp;
quit;

data want;
   set temp;
   value1+qty1;
   value2+qty2;
   want=value2+&sum_qty1-value1;
   if missing(qty2) then want=.;
   drop value:;
run;