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。