Proc SQL:运行总计

时间:2019-03-01 07:00:45

标签: 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.id and a.year=b.year and a.qtr >= b.qtr
group by 1,2,3,4;
quit;

但是结果不正确,但是如果我的销售额是100,而不是2200,结果是正确的吗?

2 个答案:

答案 0 :(得分:1)

您正在汇总错误的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;

答案 1 :(得分:0)

A别名用作保护值的提供者,该保护值限制了连接到其中的B行的数量。因此,如果您SUM(A.SALES)实际上是将保护行的销售额乘以与其匹配的B行的数量乘以A.qtr >= B.qtr

group by 1,2,3,4确实可以是group by 1,2,3。你知道为什么吗?

第4 A.saleswhere准则一起导致A.sales对于第1,2组始终相同,3,因此是不必要的。

检查未分组的结果以获得更好的理解:

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)会提供正确的结果,因为这些结果是要聚合的组中的从属(或明细)值。