我有以下数据,并且正在创建运行总计-
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,结果是正确的吗?
答案 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.sales
与where
准则一起导致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)
会提供正确的结果,因为这些结果是要聚合的组中的从属(或明细)值。