Sas procsql:运行总计
我有以下数据,我正在创建运行总数-Sas procsql:运行总计,sas,Sas,我有以下数据,我正在创建运行总数- data test; input id$ year qtr sales; cards; a 2015 1 100 a 2015 2 2200 a 2015 3 100 a 2015 4 100 b 2015 1 10 b 2015 2 10 ;run; proc sql; select a.id,a.year,a.qtr,a.sales,sum(a.sales) as running_tot from test a,test b where a.id=b
data test;
input id$ year qtr sales;
cards;
a 2015 1 100
a 2015 2 2200
a 2015 3 100
a 2015 4 100
b 2015 1 10
b 2015 2 10
;run;
proc sql;
select a.id,a.year,a.qtr,a.sales,sum(a.sales) as running_tot
from test a,test b where a.id=b.id and a.year=b.year and a.qtr >= b.qtr
group by 1,2,3,4;
quit;
但是结果是不正确的,但是如果我将sales设置为100而不是2200,那么结果是正确的?您对sales变量的求和是错误的
select a.id,a.year,a.qtr,a.sales
, sum(b.sales) as running_tot
from test a
left join test b on a.id=b.id and a.year=b.year and a.qtr >= b.qtr
group by 1,2,3,4
;
当然,只使用数据步骤更容易
data want ;
set test;
by id year qtr;
if first.year then running_tot=0;
running_tot + sales;
run;
A
别名充当保护值的提供者,该值限制连接到它的B
行的数量。因此,如果您SUM(A.SALES)
您实际上是将保护行的销售额乘以与其匹配的B行的数量,再乘以A.qtr>=B.qtr
分组1,2,3,4
实际上可以是分组1,2,3
。你明白为什么吗
第4列,A.sales
与标准结合,其中
标准导致第1、2、3组的A.sales
始终相同,因此不必要
检查未分组的结果以更好地理解:
proc sql;
create table work.result_ungrouped as
select
a.id,
a.year,
a.qtr as a_qtr,
a.sales as a_sales,
b.qtr as b_qtr,
b.sales as b_sales
from
test a,
test b
where
a.id = b.id and
a.year = b.year and
a.qtr >= b.qtr
;
quit;
因此,正确的结果通过
SUM(B.sales)
传递,因为这些是正在聚合的组中的从属(或详细)值。感谢Tom的快速回复:)。请你简单介绍一下,如果我选择a.销售而不是b.销售有什么区别。我对此有点困惑。再次感谢您的帮助。如果您使用A.SALES,则结果是季度数乘以本季度值,因为A.SALES不会对所有求和的结果行进行更改。所以如果你的季度销售额是1,2,3,4,那么你的结果是1,4,9,16。