如何在SAS中将按产品和年份分组的值相加?

时间:2015-06-02 11:25:45

标签: sum sas

我需要获得每年每种股票的总量值。 数据看起来像

SELECT TOP 1 * FROM YourTableName ORDER BY RND(CUSTID)

我想要的是

Date    ID    volume
2009    BA     100
2009    BA     20
2011    BA     100
2009    VOD    100
2009    VOD    150
2009    VOD    100    
2013    BT     300
...    ...     ...

我使用了代码

Date    ID    sumvolume
2009    BA     120
2011    BA     100
2009    VOD    350   
2013    BT     300
...    ...     ...

但是这一年只给出了每年的总额而不是每年每只股票的总额。

任何人都可以帮我处理代码吗?在此先感谢!!!

3 个答案:

答案 0 :(得分:1)

您可以使用group by语句在group by语句中的变量定义的组中使用汇总函数(如sum())。

proc sql;
    create table want as select
    date,
    id,
    sum(volume) as sumvolume
    from data
    group by id, date;
quit;

答案 1 :(得分:1)

自从使用where sub.date=main.date以来,您获得的是每年的总存量。如果您要将and sub.ID = main.ID添加到where子句中,您将获得每个产品。但这不是您预期的行为,因为您通过在*语句中添加select而不是group by语句来保持每个人的观察。

您可以使用data来完成您想要的行为,而不是group by表上的子查询。

input Date ID $ volume;
datalines;
2009    BA     100
2009    BA     20
2011    BA     100
2009    VOD    100
2009    VOD    150
2009    VOD    100
2013    BT     300
;

data work.want;
input Date ID $ sumvolume;
datalines;
2009    BA     120
2011    BA     100
2009    VOD    350   
2013    BT     300
;


proc sql;
create table work.wanted as
select Date, ID, sum(volume) as sumvolume
from work.data
group by Date, ID
;

我将一件事留给你,对结果表进行排序。

答案 2 :(得分:0)

如果您的源数据尚未排序,请先执行此操作:

proc sort data=input ;
  by ID date;
run ;

然后你可以通过一个简单的传递来做到这一点:

data output(drop=volume) ;
  retain sumvolume ;
  set input ;
  by ID date ;
  if first.date then sumvolume=volume ;
  else sumvolume=sum(sumvolume,volume) ;
  if last.date then output ;
run ;