很抱歉,不知道如何最好地说出来,所以我只是举个例子。
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中执行此操作的最佳方法是什么?
谢谢!
答案 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)