2016-07-08 2 views
0

私のデータはこのように見え、列 "取得"の取得方法はわかりません。残念なことに、保持、遅れ、および総和関数のさまざまな組み合わせを試みましたが、成功しませんでした。2つの列の間で分割された行の合計

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  

は、あなたが一歩でこれを行うことができるかもしれません。この問題上の任意のヘルプ

答えて

2

数値1を合計して値をマクロ変数に格納すると便利です。余計なデータを使用する例:

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; 
1

いただきありがとうございますが、以下は二つに望ましい結果を生成します。最初のステップは、関連する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; 
1

は「ローリング・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; 
関連する問題