SAS按组求和,然后为每个组创建新变量

SAS按组求和,然后为每个组创建新变量,sas,Sas,我想对每个组进行求和,并为每个组的求和创建一个新变量。我尝试了procsql,但它只创建了一个新变量。 我的数据集看起来像: data have; input firm year product$ value; datalines; 1 2012 a 5 1 2012 a 6 1 2012 b 3 1 2013 a 4 1 2013 a 3 1 2013 b 4 1 2013 b 3 2 2012 a 5 2 2012 a 6 2 2012 b 3 2 2012 b 4 2 2012 b 2 2

我想对每个组进行求和,并为每个组的求和创建一个新变量。我尝试了procsql,但它只创建了一个新变量。 我的数据集看起来像:

data have;
input firm year product$ value;
datalines;
1 2012 a 5
1 2012 a 6
1 2012 b 3
1 2013 a 4
1 2013 a 3
1 2013 b 4
1 2013 b 3
2 2012 a 5
2 2012 a 6
2 2012 b 3
2 2012 b 4
2 2012 b 2
2 2013 a 4
2 2013 a 5
2 2013 b 3
2 2013 b 3
;
run;
我想要的是一个有四列的表格:公司年度产品a_sum产品B_sum

我试着这样做:

proc sql;
create table h.want as
select a.*, sum(a.value) as sumvalue
from h.have as a
group by firm, year, product;
quit;
但是它只创建一个新列。

要根据另一个变量的值获得单独的SUM()结果,需要使用CASE语句,而不是将其包含在分组变量中

proc sql;
create table want as
  select firm, year
       , sum(case when (product='a') then value else . end) as sum_product_A
       , sum(case when (product='b') then value else . end) as sum_product_B
  from have
  group by firm,year
;
quit;

如果您希望总和为零而不是缺失,如果乘积从未出现,则将else子句中缺失的值替换为0。

您正在旋转一个聚合总和。如果要应对两个以上的产品价值,那么两步法可能更可取

proc summary data=have nway noprint;
  class firm year product;
  var value;
  output out=class_sums sum=sum;
run;

proc transpose data=sums suffix=_sum out=want(drop=_name_);
  by firm year;
  id product;
  var sum;
run;

因为u组有三个变量,但是在select中,您选择了所有变量。这将导致按功能分组无效

/*Try this one*/     
proc sql;
    create table h.want as
    select a.firm, a.year, a.product, sum(a.value) as sumvalue
    from h.have as a
    group by firm, year, product;
    quit;

如果不需要所有原始数据,则不要包含既不是分组键也不是聚合函数的变量。当您这样做时,SAS必须将聚合值重新合并到所有原始观测值上,以便能够返回这些变量的所有值。您的查询在输出中包含VALUE。