如何在列中包含组的名称并汇总值?

时间:2017-05-05 14:36:04

标签: sql sas

很抱歉,不知道如何最好地说出来,所以我只是举个例子。

1  VA b x 10
2  VA g y  5
3  VA b x  6
4  VA s y  7
5  VA s x  8
6  PA b y  1
7  PA s x  4
8  PA g y  5
9  PA s x  6
10 PA b y  9 

我想总结以下数据:

       x_b    x_s     x_g     y_b    y_s    y_g
VA     16       8      0      9      7      0
PA      0      10      0      9      0      5

我的每个州有一行,两个组的组合(x,y组和b,s,g组)在顶部,并总结了所有分组的值。

在SQL中执行此操作的最佳方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以使用条件聚合执行此操作:

proc sql;
    select state,
           sum(case when col3 = 'b' and col4 = 'x' then col5 else 0 end) as x_b,
           sum(case when col3 = 's' and col4 = 'x' then col5 else 0 end) as x_s,
           sum(case when col3 = 'g' and col4 = 'x' then col5 else 0 end) as x_g,
           sum(case when col3 = 's' and col4 = 'y' then col5 else 0 end) as y_s,
           sum(case when col3 = 'g' and col4 = 'y' then col5 else 0 end) as y_g
    from t
    group by state;

答案 1 :(得分:0)

不要在SQL中执行此操作。你在SAS,使用你拥有的工具:这里PROC TABULATE是最好的工具。

data have;
input obs state $ var1 $ var2 $ val;
datalines;
1  VA b x 10
2  VA g y  5
3  VA b x  6
4  VA s y  7
5  VA s x  8
6  PA b y  1
7  PA s x  4
8  PA g y  5
9  PA s x  6
10 PA b y  9 
;;;;
run;

proc tabulate data=have;
  class state var1 var2;
  var val;
  tables state, var1=' '*var2=' '*val=' '*sum=' '/printmiss misstext='0';
run;

如果你想要一个数据集而不是一个印刷表,那就很容易了。只需从TABULATE创建一个数据集,然后进行一些小的更改并转置它。

proc tabulate data=have out=want_first;
  class state var1 var2;
  var val;
  tables state, var1=' '*var2=' '*val=' '*sum=' '/printmiss misstext='0';
run;

data want_pret;
  set want_first;
  var_name = catx('_',var2,var1);
  value    = coalesce(val_sum,0);
  keep state var_name value;
run;

proc transpose data=want_pret out=want;
  by state;
  id var_name;
  var value;
run;

请注意,这些都不需要对任何变量的值进行硬编码 - 无论您在var1 / var2中放置什么,这都将为您提供正确的结果。

答案 2 :(得分:0)

如果您想使用交叉表PROC FREQ。使用WEIGHT语句传入exiting计数,使用SPARSE选项获取零输出。

proc freq data=have ;
  tables state*v2*v1 / noprint out=counts sparse ;
  weight cnt ;
run;

然后,您可以使用PROC TRANSPOSE将结果转换为横向格式。

proc transpose data=counts delimiter=_ 
 out=want(drop= _name_ _label_)
;
  by state ;
  id v2 v1 ;
  var count ;
run;

enter image description here